from tensorflow.keras.datasets import cifar10
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import cifar10
import matplotlib.pyplot as plt
import numpy as np
#---------------加载MNIST---------------#
(x_train,y_train),(x_test,y_test) = cifar10.load_data()
# 打印信息
print("训练数据集:{0}".format(x_train.shape))
print("训练数据集标签:{0}".format(y_train.shape))
print("测试数据集:{0}".format(x_test.shape))
print("测试数据集标签:{0}".format(y_test.shape))
#对图像像素值进行标准化,将其缩放至0-1之间
x_train=x_train.astype('float32')/255.0
x_test=x_test.astype('float32')/255.0
#将标签转化为one-hot编码类型
y_train=keras.utils.to_categorical(y_train)
y_test=keras.utils.to_categorical(y_test)
print(y_test[:5])
import matplotlib.pyplot as plt
import numpy as np
#可视化25张图
def plot_image_labels_prediction(images, #图像列表
labels, #标签列表
idx, #从第idx个开始显示
nums): #缺省一次显示10幅
fig=plt.gcf() #调取当前图标,全称为get current figure
fig.set_size_inches(12,14) #设置图标大小,单位为英寸,1英寸等于2.54cm
if nums>25:
nums=25 #最多显示25张图片
for i in range(0,nums):
ax=plt.subplot(5,5,1+i) #子图生成
ax.imshow(images[idx])
title='label'+str(np.argmax(labels[idx]))#定义title方便图像结果对应
ax.set_title(title,fontsize=10) #设置图像title
ax.set_xticks([]) #无x刻度
ax.set_yticks([]) #无y刻度
idx+=1
plt.show()
plot_image_labels_prediction(x_train,y_train,0,25)
#模型训练,定义模型
from keras import models, layers
def build_model():
model = models.Sequential()
# first layer
model.add(layers.Conv2D(16, (3,3), padding='same', activation='relu', data_format='channels_last', input_shape=(32,32,3)))
model.add(layers.Conv2D(16, (3,3), padding='same', activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
# second layer
model.add(layers.Conv2D(32, (3,3), padding='same', activation='relu'))
model.add(layers.Conv2D(32, (3,3), padding='same', activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
# third layer, flatten
model.add(layers.Flatten())
# fourth layer
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])
return model
network = build_model()
network.summary()
#定义优化器,损失函数
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
network.compile(loss='categorical_crossentropy', optimizer=optimizer,metrics=['acc'])
history = network.fit(x_train,y_train, epochs=5, batch_size=64, validation_split=0.2)
#可视化
# plot train history
loss = history.history['loss']
val_loss = history.history['val_loss']
acc = history.history['acc']
val_acc = history.history['val_acc']
plt.figure(figsize=(10,3))
plt.subplot(1,2,1)
plt.plot(loss, color='blue', label='train')
plt.plot(val_loss, color='red', label='test')
plt.ylabel('loss')
plt.legend()
plt.subplot(1,2,2)
plt.plot(acc, color='blue', label='train')
plt.plot(val_acc, color='red', label='test')
plt.ylabel('accuracy')
plt.legend()
#可视化25张图像
def plot_image_labels_prediction(images,labels,prediction,idx,nums=25):
fig = plt.gcf()
fig.set_size_inches(12, 14)
if nums > 25: nums = 25
for i in range(0, nums):
ax = plt.subplot(5, 5, 1 + i)
ax.imshow(images[idx], cmap='binary')
title = 'label' + str(np.argmax(labels[idx]))
if (len(prediction) > 0):
title += 'prediction=' + str(np.argmax(labels[idx]))
ax.set_title(title, fontsize=10)
ax.set_xticks([])
ax.set_xticks([])
idx += 1
plt.show()
predict_x =network.predict(x_test)
classes_x = np.argmax(predict_x,axis=1)
prediction = classes_x
plot_image_labels_prediction(x_test,y_test,prediction,idx=340)
以上为总代码
直接复制,即可运行
模型可以替换更好更准确的,可视化也可省略
以上是模型打印输出数据
损失函数,优化器显示,这里训练了5次,想要更精确可以把epochs数值修改大一点,