fashion mnist数据集是成为经典mnist数据集的简易替换。mnist数据集包含手写数字(0,1,2等)的图像,这些图像的格式与fashion mnist数据集中使用的服饰图像的格式相同。相对而言,这两个数据集比较简单,适合初学者。
Fashion MNIST数据集包含70000张灰度图像,涵盖裙子、衬衫、裤子、鞋、包等10个类别。
本示例将使用60000张图像训练网络,并使用10000张图像测试学习的网络分类图像的准确率。可以从tensorflow直接访问该数据集,只需要导入和加载数据即可。
(1)
加载数据
import tensorflow as tf
print('Tensorflow Version: {}'.format(tf.__version__))
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
(train_image, train_lable), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()
若第一次使用此数据集,要从国外网站下载,会很慢;也可以直接下载数据集放到c盘的用户-86188-.keras-datasets文件夹中。
train_image.shape
看train_image的形状,输出结果为(60000, 28, 28),即60000张28×28的图片。
看一下train_image的第一张图片:
plt.imshow(train_image[0])
是一张鞋子,train_image内各个点的取值范围均为0-255。
看一下这些点里面的最大值:
np.max(train_image)
本示例输出结果为255.
train_lable代表种类,从0-9有十种分类。
(2)
数据处理:
神经网络比较喜欢固定的输入值,比如在输入前,将数据归一化为0到1之间的数。
对于图像数据而言,归一化的方法就是将此数据除以255:
train_image = train_image / 255
test_image = test_image / 255
这样,train_image 和test_image的取值范围都变成了[0,1]。
再看一看train_image 的形状,因为下面会用到:
train_image.shape
输出结果为(60000, 28, 28)
(3)
建立模型,进行分类:
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape(28,28)))#将图像扁平为28×28的向量
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))#输出10个概率
Dense是把一个一维(张量为1)的数据映射到另一个一维的数据上。
对于二维的数据,需要进行Flatten,将其扁平为一维的。
(4)
编译模型:
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy'
metrics=['acc']
)
(5)
训练模型:
model.fit(train_image, train_lable, epochs=5)
(6)
评价模型:
model.evaluate(test_image, test_lable)
(7)
转换为独热编码onehot:
仍采用之前的数据集
train_lable_onehot = tf.keras.utils.to_categorical(train_lable)
(8)
预测:
predict = model.predict(test_image)
predict.shape
会输出(10000,10),即10000个长度为10的数据。因为test_image的形状是(10000,28,28),对这10000个图像,每个图像都给出长度为10的向量,代表其分类结果。
predict[0]
会输出一个10维向量。
np.argmax(predict[0])
取出其中的最大的值所在的索引,本案例结果为9.
(9)dropout:
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) # 28*28
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
Drpout()有一个参数rate,应是0到1之间的值,代表需要丢弃掉多少数值。Dropout(0.5)
代表激活50%,丢弃50%的数据。