TensorFlow 2之Fashion MNIST 图像分类

  |   0 评论   |   0 浏览

背景

从实例来学习TensorFlow。

本文为官方例子,通过使用神经网络对服饰图片进行分类。

环境

Fashion MNIST 数据集

https://github.com/zalandoresearch/fashion-mnist

Fashion Mnist数据集由70,000张黑白图片构成,每张图片大小为 28x28,由十类服饰图片构成。另一个MNIST数据集是手写数字,Fashion MNIST 与之相比更有挑战性,适合用来验证算法。

代码和解释

#!/usr/bin/python3

# TensorFlow and tf.keras

import tensorflow as tf
from tensorflow import keras

# Helper libraries

import numpy as np

# 第一步 准备数据集

# Fashion Mnist数据集由70,000张黑白图片构成,每张图片大小为 28x28,由十类服饰图片构成。

# 另一个MNIST数据集是手写数字,Fashion MNIST 与之相比更有挑战性,适合用来验证算法。

fashion_mnist = keras.datasets.fashion_mnist

# fashion_mnist = keras.datasets.fashion_mnist.input_data.read_data_sets("mnistdata/", one_hot=True)

# 我们使用60,000张图片作为训练集,10,000张图片作为测试集。

# 这个数据集可以从 TensorFlow 中直接获取,返回值为numpy数组。

(train_images, train_labels), (test_images,
test_labels) = fashion_mnist.load_data()

# 数据格式

# train_images.shape # (60000, 28, 28)

# len(train_labels) # 60000

# train_labels # ([9, 0, 0, ..., 3, 0, 5], dtype=uint8)

# test_images.shape # (10000, 28, 28)

# len(test_labels) # 10000

# 第二步 预处理

# 训练之前,我们需要对数据进行预处理。图片的每个像素值在0-255之间,需要转为0-1。训练集和测试集都需要经过相同的处理。

train_images = train_images / 255.0
test_images = test_images / 255.0

# 第三步 搭建模型

# 神经网络的基本构成是网络层(layer),大部分深度学习网络都由多个简单的 layers 构成。

# 网络的第一层,Flatten将输入从28x28 的二维数组转为784的一维数组,这一层的作用仅仅是将每一行值平铺在一行。

# 接下来是2层Dense,即全连接层(fully connected, FC)

# 第一层Dense有128个神经元。

# 第二层有10个神经元,经过 softmax 后,返回了和为1长度为10的概率数组,每一个数分别代表当前图片属于分类0-9的概率。

model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])

# 第四步 编译模型

# 模型准备训练前,在模型编译(Compile)时还需要设置一些参数

# Loss function - 损失函数,训练时评估模型的正确率,希望最小化这个函数,往正确的方向训练模型。

# Optimizer - 优化器算法,更新模型参数的算法。

# Metrics - 指标,用来监视训练和测试步数,下面的例子中使用accuracy,即图片被正确分类的比例。

model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

# 第五步 训练模型

# 训练神经网络,通常有以下几个步骤。

# 传入训练数据,train_images和train_labels。

# 训练模型去关联图片和标签。

# 模型对测试集test_images作预测,并用test_labels验证预测结果。

model.fit(train_images, train_labels, epochs=10)

# 第六步 评估准确率

# 看看在测试集中表现如何?

test_loss, test_acc = model.evaluate(test_images, test_labels)
print('\nTest accuracy:', test_acc)

# 测试集的准确率低于训练集,训练集和测试集准确率之间的差距代表模型过拟合(overfitting)。即对于训练中没有见过的新数据,模型表现差。

# 第七步 预测

# 使用predict函数进行预测。

predictions = model.predict(test_images)

# 看下第一张图片的预测结果。

print(predictions[0])

# array([1.06-05, 5.06-12, 8.44-08, 4.09-09, 2.87-07, 2.28-04,

# 6.18-06, 2.48-02, 3.81-06, 9.74-01], dtype=float32)

# 每次预测返回长度为10的数组,代表属于每一种分类的可能性,最大可能性的label是9。测试集中的数据也是9,预测正确。

print(np.argmax(predictions[0])) # 9
print(test_labels[0]) # 9

运行结果

Epoch 1/10
1875/1875 [==============================] - 2s 926us/step - loss: 0.4980 - accuracy: 0.8264
Epoch 2/10
1875/1875 [==============================] - 2s 947us/step - loss: 0.3789 - accuracy: 0.8630
Epoch 3/10
1875/1875 [==============================] - 2s 936us/step - loss: 0.3405 - accuracy: 0.8752
Epoch 4/10
1875/1875 [==============================] - 2s 943us/step - loss: 0.3134 - accuracy: 0.8845
Epoch 5/10
1875/1875 [==============================] - 2s 935us/step - loss: 0.2982 - accuracy: 0.8897
Epoch 6/10
1875/1875 [==============================] - 2s 927us/step - loss: 0.2810 - accuracy: 0.8970
Epoch 7/10
1875/1875 [==============================] - 2s 930us/step - loss: 0.2705 - accuracy: 0.8996
Epoch 8/10
1875/1875 [==============================] - 2s 944us/step - loss: 0.2577 - accuracy: 0.9041
Epoch 9/10
1875/1875 [==============================] - 2s 931us/step - loss: 0.2484 - accuracy: 0.9070
Epoch 10/10
1875/1875 [==============================] - 2s 941us/step - loss: 0.2384 - accuracy: 0.9114
313/313 [==============================] - 0s 702us/step - loss: 0.3362 - accuracy: 0.8811

Test accuracy: 0.8810999989509583
[5.7795262e-07 3.3417108e-10 5.2681703e-10 3.1691635e-11 4.8290321e-08
 3.6059657e-05 8.1326658e-07 1.8523213e-03 7.3826897e-08 9.9811006e-01]
9
9

参考

附录

tensorflow安装

python3 -m pip install --upgrade pip
pip3 install tensorflow