0.前言
写给自己当作记录,是对1.0版本的代码换一种形式。
1.0版本中的代码的模型构建、训练、评估都是手打的,效果肯定没有tf2.0自带的工具好。
在参考tf2.0的官方文档后,把代码换成更简洁有效的方式。实际操作时不管是编程体验还是最后输出效果都比自己手打好太多了(虽然最后的准确率并没有上升)。要提升准确率应该得优化模型,而我的模型还没有变,所以准确率和原来差不多。
本文主要记录下用官方自带的方法去做CNN图片分类的步骤,以后再用时作为快速复习使用。
1.CODE
1.1 先引入需要的第三方库
#import 需要的第三方库
import numpy as np
import os
import cv2
import tensorflow as tf
1.2 如何将图片数据处理成能够输入CNN的数据
def readfile(path, label):
#label是bool,表示是否返回y
image_dir = os.listdir(path) #image_dir是个list
# x是个4维的numpy数组[图片个数,图片长,图片宽,色彩通道],例如,training里有9866张彩色图片,假设分辨率为64*64,x的维度为[9866, 64, 64, 3]
# y是个向量,长度为图片个数,表示图片类别标签,从0-10共有11个类别
# 注意x、y的数据类型
x = np.zeros((len(image_dir), 64, 64, 3), dtype=np.float32)
y = np.zeros((len(image_dir)), dtype=np.int32)
for i, file in enumerate(image_dir):
img = cv2.imread(path+"\\"+file) #得到图片的地址信息
x[i] = cv2.resize(img,(64, 64)) #把第i张图片大小统一为64*64
if label:
y[i] = int(file.split("_")[0])
#training要x和y,testing只要x
if label:
return x, y
else:
return x
1.3 读取数据
#得到training、validation、testing数据
CNN_path = "E:\\Machine Learning\\data\\data1\\hw3\\food-11"
print(10*"="+"Reading Data"+10*"=")
train_x, train_y = readfile(CNN_path+"\\training", True)
train_x = train_x.astype(np.float32)/255.0
print("Size of training data = {}".format(len(train_x)))
val_x, val_y = readfile(CNN_path+"\\validation", True)
val_x = val_x.astype(np.float32)/255.0
print("Size of validation data = {}".format(len(val_x)))
print("train_x shape:{}".format(train_x.shape))
print("train_y shape:{}".format(train_y.shape))
1.4 搭建CNN模型
#定义CNN Model
inputs = tf.keras.Input(shape=(64, 64, 3))
x = tf.keras.layers.Conv2D(
filters=64,
kernel_size = [3, 3],
padding = 'same',
activation = tf.nn.relu
)(inputs)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)
x = x = tf.keras.layers.Conv2D(
filters=128,
kernel_size = [3, 3],
padding = 'same',
activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)
x = x = tf.keras.layers.Conv2D(
filters=256,
kernel_size = [3, 3],
padding = 'same',
activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)
x = x = tf.keras.layers.Conv2D(
filters=512,
kernel_size = [3, 3],
padding = 'same',
activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)
x = x = tf.keras.layers.Conv2D(
filters=512,
kernel_size = [3, 3],
padding = 'same',
activation = tf.nn.relu
)(x)
x = tf.keras.layers.MaxPool2D(pool_size=[2,2], strides=2)(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)(x)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Dense(units=512, activation=tf.nn.relu)(x)
x = tf.keras.layers.Dense(units=11)(x)
outputs = tf.keras.layers.Softmax()(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
1.5 模型的训练、评估
#配置训练过程
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=[tf.keras.metrics.sparse_categorical_accuracy]
)
#训练模型
model.fit(train_x, train_y, epochs=40, batch_size=165)
#评估模型
print(model.evaluate(val_x, val_y))
END
以上有任何疑问,参考tf2.0官方文档
tf2.0 官方文档