目录
概要
fashion_mnist数据集与mnist数据集差不多,都是我们常用的用来训练神经网络的数据集,其中包含10个类别,分别是
name=['T恤','裤子','套衫','裙子','外套','凉鞋','汗衫','运动鞋','包','踝靴']
训练集每个类别的图片包含6000张,总共60000张,测试集每个类别的图片包含1000张,总共10000张,每张图片为28*28的像素数组,常用于分类任务的训练。
这里给网络连接不顺畅的朋友分享数据集下载链接:https://pan.baidu.com/s/1LJg8N4SHgR7nOw6-S9fAGA
提取码:8h91
下载好后文件夹里有4个压缩文件,将文件放入C/user/username/.keras/datasets目录下(运行一次程序后会在c盘自动生成该目录,如果没有就再次运行一下)
代码
import numpy as np
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import matplotlib.pyplot as plt
from tensorflow import keras
fashion_mnist=keras.datasets.fashion_mnist #下载fashion_mnist数据集
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
train_images=train_images.reshape(60000,28,28,1) #
train_images=train_images/255.0 #归一化
test_images=test_images.reshape(10000,28,28,1)
test_images=test_images/255.0 #归一化
plt.rcParams['font.sans-serif']='SimHei' #python显示正常汉字
class myCallback(tf.keras.callbacks.Callback): #回调函数,设置当loss小于一定值时训练停止
def on_epoch_end(self, epoch, logs={}):
if(logs.get('loss')<0.3):
print('\nReached 60% accuracy so cancelling training!')
self.model.stop_training=True
callbacks=myCallback() #实例化myCallback
model=tf.keras.models.Sequential(
[
tf.keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)), #第一层卷积,卷积核大小为(3*3),步长默认为(1*1),卷积核个数为64,通道个数为1
tf.keras.layers.MaxPooling2D(2,2), #第一层最大池化,池化大小为(2*2)
tf.keras.layers.Dropout(0.5), #防止过拟合
tf.keras.layers.Conv2D(64,(3,3),activation='relu'), #第二层卷积,激活函数为relu
tf.keras.layers.MaxPooling2D(2,2), #第二层池化
tf.keras.layers.Dropout(0.5), #防止过拟合
tf.keras.layers.Flatten(), #拉直
tf.keras.layers.Dense(128,activation='relu'), #全连接层
tf.keras.layers.Dense(10,activation='softmax') #输出10个类别
]
)
model.summary() #查看model结构
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy']) #设置优化器,损失函数,显示成功率
model.fit(train_images,train_labels,epochs=5,callbacks=[callbacks]) #开始训练,输入train_images,真实值为train_labels,迭代5次,调用callables达到一定成功率结束训练
test_loss=model.evaluate(test_images,test_labels) #测试集进行测试
##########################################################用于可视化显示测试图片和结果标签
name=['T恤','裤子','套衫','裙子','外套','凉鞋','汗衫','运动鞋','包','踝靴']
result=model.predict(test_images) #result数组用于存放所有测试集的结果标签
def show_pic(n):
plt.figure() #绘制figure窗口
plt.suptitle('测试结果') #标题
for i in range(n):
num = np.random.randint(1, 10000) #从10000个测试图片中随机选取
plt.subplot(4, n/4, i + 1) #将窗口分为4行n/4列,当前位置为i+1
plt.axis('off') #关闭坐标轴
plt.imshow(test_images[num], cmap='gray') #开始绘制图片,设置颜色为灰色
plt.title(str(name[(np.argmax(result[num]))])) #np.argmax()返回最大值的索引,显示对应索引的中文名称
plt.tight_layout(rect=[0, 0, 1, 0.9]) #调整子图与标签位置
plt.show() #显示图片
show_pic(20) #选择测试集中的20张图片用来可视化显示结果
###########################################################
训练结果: