网上有很多博主写的训练CIFAR-10的代码,本次只是单纯记录一下自己调试的一个程序,对于初学深度学习的小白可以参考,如有不对,请多多见谅!!!
一、CIFAR-10数据集由10个类的60000个32x32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。
二、代码中利用的是TF1.14,CUDA10.0,win10系统。首先导入我们需要的库。
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.datasets import cifar10
import matplotlib.pyplot as plt
然后加载训练集和测试集,并且将数值转换成一种热编码二进制数组,并且将图像的RGB值从0-255转换到0-1之间,并且创建空的顺序模型。
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train_one_hot = keras.utils.to_categorical(y_train, 10)
y_test_one_hot = keras.utils.to_categorical(y_test, 10)
x_train = x_train.astype(‘float32’)
x_test = x_test.astype(‘float32’)
x_train = x_train/255
x_test = x_test/255
model = Sequential()
模型空间结构的话,源代码给出的是两次卷积和池化(最大池化)(32和64)
model.add(Conv2D(32, (3, 3), activation=‘relu’, padding=‘same’, input_shape=(32, 32, 3)))
model.add(Conv2D(32, (3, 3), activation=‘relu’, padding=‘same’))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation=‘relu’, padding=‘same’))
model.add(Conv2D(64, (3, 3), activation=‘relu’, padding=‘same’))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation=‘relu’))
model.add(Dropout(0.5))
model.add(Dense(10, activation=‘softmax’))
model.summary()
设置的指标是准确率,采用的是交叉熵损失函数,利用了adam优化器。
pile(loss=‘categorical_crossentropy’,
optimizer=‘adam’,
metrics=[‘accuracy’])
hist = model.fit(x_train, y_train_one_hot,
batch_size=32, epochs=200,
validation_split=0.2)
其他设置的都是一些绘图的代码。
plt.plot(hist.history[‘loss’])
plt.plot(hist.history[‘val_loss’])
plt.title(‘Model loss’)
plt.ylabel(‘Loss’)
plt.xlabel(‘Epoch’)
plt.legend([‘val’, ‘train’], loc=‘upper right’)
plt.show()
plt.plot(hist.history[‘acc’])
plt.plot(hist.history[‘val_acc’])
plt.title(‘Model accuracy’)
plt.ylabel(‘Accuracy’)
plt.xlabel(‘Epoch’)
plt.legend([‘val’, ‘train’], loc=‘lower right’)
plt.show()
model.evaluate(x_test, y_test_one_hot)
model.save(‘D:\shenduxuexijichu\1\modelepoch200.h5’)
最后将模型保存。
三、将其形成一个train.py文件,进行运行,可以适当修改网络参数,多次训练,
四、训练之后,用自己训练的model,进行测试,测试采用Github其他博主的代码进行修改,运行之后结果为
import matplotlib.pyplot as plt
import numpy as np
from skimage.transform import resize
from keras.models import load_model
import os
model = load_model(‘D:\shenduxuexijichu\saveh5\modelepoch200.h5’)
print(“导入模型成功!”)
l = 1
a = os.listdir(“D:\shenduxuexijichu\data\”)
print(“读取数据…”)
for i in a:
if “jpg” in i:
my_image = plt.imread(‘D:\shenduxuexijichu\data\’ + i)
my_image_resized = resize(my_image, (32, 32, 3))
probabilities = model.predict(np.array([my_image_resized]))number_to_class = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']#Cifar10类别:飞机 汽车 鸟 猫 鹿 狗 青蛙 马 船 卡车index = np.argsort(probabilities[0, :])print("第{}张照片".format(l))print("最像的是:", number_to_class[index[9]], "概率为:", probabilities[0, index[9]])print("第二像的是:", number_to_class[index[8]], "概率为:", probabilities[0, index[8]])print("第三像的是:", number_to_class[index[7]], "概率为:", probabilities[0, index[7]])print("第四像的是:", number_to_class[index[6]], "概率为:", probabilities[0, index[6]])print("第五像的是:", number_to_class[index[5]], "概率为:", probabilities[0, index[5]])print("预测完成!")print("即将预测下一张照片...")print("--------------------")l = l + 1
print(“测试结束!”)
以上是训练加测试CIFAR-10数据集的某一种方法,如有不对,请多多指正!!!