54. TensorFlow 时尚物品分类#
54.1. 介绍#
本次挑战将由你独立完成一个开放性的分类预测练习,你需要使用 Fashion-MNIST 时尚物品数据集,并通过 TensorFlow Keras 来构建一个合理的 DNN 网络。
54.2. 知识点#
Keras 构建神经网络
灰度数据标准化
Flatten, Dropout 层
Fashion-MNIST 时尚物品数据集包含 70,000 张图片,其中训练集为 60,000 张 28x28 像素灰度图像,测试集为 10,000 同规格图像,总共 10 类时尚物品标签。
类别 |
描述 |
中文 |
---|---|---|
0 |
T-shirt/top |
T 恤/上衣 |
1 |
Trouser |
裤子 |
2 |
Pullover |
套头衫 |
3 |
Dress |
连衣裙 |
4 |
Coat |
外套 |
5 |
Sandal |
凉鞋 |
6 |
Shirt |
衬衫 |
7 |
Sneaker |
运动鞋 |
8 |
Bag |
背包 |
9 |
Ankle boot |
短靴 |
下面,我们使用 TensorFlow 直接加载该数据集。
import tensorflow as tf
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
# 对特征进行标准化处理
X_train = X_train / 255
X_test = X_test / 255
X_train.shape, X_test.shape, y_train.shape, y_test.shape
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
29515/29515 [==============================] - 0s 7us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26421880/26421880 [==============================] - 2s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
5148/5148 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 [==============================] - 1s 0us/step
((60000, 28, 28), (10000, 28, 28), (60000,), (10000,))
读取数据之后,由于是灰度图像,可以直接除以 255
进行标准化。除此之外,也可以使用 TensorFlow 提供的
tf.keras.utils.normalize
等方法对数据进行标准化。之后,我们可视化训练集第一个样本查看:
from matplotlib import pyplot as plt
%matplotlib inline
plt.imshow(X_train[0], cmap=plt.cm.gray)
plt.title(y_train[0])
接下来,我们准备构建一个包含有 2 个隐含层的 DNN 网络完成图片分类。
开放型挑战
挑战:使用 TensorFlow Keras 构建一个包含有 2 个隐含层的 DNN 全连接人工神经网络,完成时尚物品分类。
规定:你可以自由选择使用 Keras 顺序模型或者函数模型进行构建。可以自由定义神经网络结构,损失函数,优化方法等。
我们推荐使用如下网络,你也可以自定义修改。
上方的推荐网络使用到的层有:
-
tf.keras.layers.Flatten
:用于将原输入 \(28 \times 28\) 的矩阵展平成行向量。🔗 -
tf.keras.layers.Dropout
:全连接层直接以一定概率断开神经元连接,防止过拟合。🔗
你需要通过官方文档学习这两个层,并学会结合前面实验中的知识来完成网络的构建和训练。
参考答案 Exercise 54.1
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
model.add(tf.keras.layers.Dense(units=512, activation='relu'))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Dense(units=128, activation='relu'))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Dense(units=10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=64, epochs=5,
validation_data=(X_test, y_test))
最终,挑战期望得到合理迭代次数下的训练集准确率和测试集准确率结果,最好能接近 90% 或更高。示例如下:
期望输出
Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - loss: 0.3098 - acc: 0.8856 - val_loss: 0.3455 - val_acc: 0.8776
Epoch 2/5
60000/60000 [==============================] - loss: 0.2981 - acc: 0.8891 - val_loss: 0.3352 - val_acc: 0.8784
Epoch 3/5
60000/60000 [==============================] - loss: 0.2885 - acc: 0.8914 - val_loss: 0.3346 - val_acc: 0.8741
Epoch 4/5
60000/60000 [==============================] - loss: 0.2802 - acc: 0.8942 - val_loss: 0.3349 - val_acc: 0.8808
Epoch 5/5
60000/60000 [==============================] - loss: 0.2738 - acc: 0.8982 - val_loss: 0.3197 - val_acc: 0.8851
相关链接
○ 欢迎分享本文链接到你的社交账号、博客、论坛等。更多的外链会增加搜索引擎对本站收录的权重,从而让更多人看到这些内容。