Fashion_MNIST数据集是一个替代MNIST手写数据集的图片数据集。它是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。 Fashion_MNIST 的大小、格式和训练集/测试集划分与原始的 MNIST 完全一致。60000/10000 的训练测试数据划分,28x28 的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
下面通过卷积神经网络来实现Fashion_MNIST数据集的分类
import tensorflow as tf
from tensorflow import keras
# Helper libraries
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
import numpy as np
import matplotlib.pyplot as plt
下载数据集并加载
EAGER = True
fashion_mnist = keras.datasets.fashion_mnist
class_names = ['T-shirt/top','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
plt.figure(figsize=(10,10)) #显示前25张图像
for i in range(25):
plt.subplot(5,5,i+1)
plt.grid(False)
plt.imshow(train_images[i],cmap=plt.cm.binary)
plt.show()
print(train_images.shape,train_labels.shape)
# 将图像的数据类型转换成浮点型,再将像素值缩小到0-1,完成数据的预处理
train_images = train_images.reshape([-1,28,28,1]) / 255.0
test_images = test_images.reshape([-1,28,28,1]) / 255.0
(60000, 28, 28) (60000,)
进行CNN网络模型的搭建,该网络模型包括两层卷积层,然后每个卷积层后面跟着一个池化层,接着将经过第二次池化的数据进行展平,最后连接两层全连接层。
model = keras.Sequential([
#(-1,28,28,1)->(-1,28,28,32)
keras.layers.Conv2D(input_shape=(28, 28, 1),filters=32,kernel_size=5,strides=1,padding='same'), # Padding method),
#(-1,28,28,32)->(-1,14,14,32)
keras.layers.MaxPool2D(pool_size=2,strides=2,padding='same'),
#(-1,14,14,32)->(-1,14,14,64)
keras.layers.Conv2D(filters=64,kernel_size=3,strides=1,padding='same'), # Padding method),
#(-1,14,14,64)->(-1,7,7,64)
keras.layers.MaxPool2D(pool_size=2,strides=2,padding='same'),
#(-1,7,7,64)->(-1,7*7*64)
keras.layers.Flatten(),
#(-1,7*7*64)->(-1,256)
keras.layers.Dense(256, activation=tf.nn.relu),
#(-1,256)->(-1,10)
keras.layers.Dense(10, activation=tf.nn.softmax)
])
print(model.summary())
基于fashion_minist train 数据对模型进行训练
lr = 0.001
epochs = 5
# 编译模型
model.compile(optimizer=tf.train.AdamOptimizer(lr),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 拟合数据
model.fit(train_images, train_labels, epochs=epochs,validation_data=[test_images[:1000],test_labels[:1000]])
Train on 60000 samples, validate on 1000 samples
Epoch 1/5
60000/60000 [==============================] - 9s 152us/step - loss: 0.3812 - acc: 0.8621 - val_loss: 0.3128 - val_acc: 0.8900
Epoch 2/5
60000/60000 [==============================] - 7s 113us/step - loss: 0.2506 - acc: 0.9080 - val_loss: 0.3029 - val_acc: 0.8970
Epoch 3/5
60000/60000 [==============================] - 7s 114us/step - loss: 0.1996 - acc: 0.9245 - val_loss: 0.2589 - val_acc: 0.9170
Epoch 4/5
60000/60000 [==============================] - 7s 114us/step - loss: 0.1615 - acc: 0.9388 - val_loss: 0.2988 - val_acc: 0.9090
Epoch 5/5
60000/60000 [==============================] - 7s 113us/step - loss: 0.1314 - acc: 0.9514 - val_loss: 0.2713 - val_acc: 0.9140
Out[4]:
<tensorflow.python.keras.callbacks.History at 0x7f32408dabe0>
基于test数据对模型进行评测
# 模型评测
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('the model\'s test_loss is {} and test_acc is {}'.format(test_loss, test_acc))
#部分预测结果展示
show_images = test_images[:10]
print(show_images.shape)
predictions = model.predict(show_images)
predict_labels = np.argmax(predictions, 1)
plt.figure(figsize=(10,5)) #显示前10张图像,并在图像上显示类别
for i in range(10):
plt.subplot(2,5,i+1)
plt.grid(False)
plt.imshow(show_images[i,:,:,0],cmap=plt.cm.binary)
plt.title(class_names[predict_labels[i]])
plt.show()