极客兔兔

TensorFlow 2 中文文档 - MNIST 图像分类

源代码/数据集已上传到 Github - tensorflow2-docs-zh

TF2.0 TensorFlow 2 / 2.0 中文文档 - 图像分类 Classify images

主要内容:使用神经网络对服饰图片进行分类。

这篇文档使用高级APItf.keras在TensorFlow中搭建和训练模型。

1
2
3
4
5
6
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np

使用 Fashion MNIST 数据集

tf2doc-ml-basic-image

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

我们使用60,000张图片作为训练集,10,000张图片作为测试集。这个数据集可以从 TensorFlow 中直接获取,返回值为numpy数组。

1
2
3
fashion_mnist = keras.datasets.fashion_mnist

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

图片大小28x28,每个像素值取值范围0-255。标签是整数,取值范围0-9,与实际的服饰类别对应关系如下。

标签 类别 标签 类别 标签 类别 标签 类别
0 T-shirt/top 3 Dress 6 Shirt 9 Ankle boot
1 Trouser 4 Coat 7 Sneaker
2 Pullover 5 Sandal 8 Bag

数据格式

1
2
3
4
5
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。训练集和测试集都需要经过相同的处理。

1
2
train_images = train_images / 255.0
test_images = test_images / 255.0

搭建模型

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

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

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

接下来是2层Dense,即全连接层(fully connected, FC),第一层Dense有128个神经元。第二层有10个神经元,经过 softmax 后,返回了和为1长度为10的概率数组,每一个数分别代表当前图片属于分类0-9的概率。

编译模型

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

  • Loss function - 损失函数,训练时评估模型的正确率,希望最小化这个函数,往正确的方向训练模型。
  • Optimizer - 优化器算法,更新模型参数的算法。
  • Metrics - 指标,用来监视训练和测试步数,下面的例子中使用accuracy,即图片被正确分类的比例。
1
2
3
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

训练模型

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

  • 传入训练数据,train_imagestrain_labels
  • 训练模型去关联图片和标签。
  • 模型对测试集test_images作预测,并用test_labels验证预测结果。

使用model.fit函数开始训练。

1
model.fit(train_images, train_labels, epochs=10)
1
2
3
4
5
6
7
8
Train on 60000 samples
Epoch 1/10
60000/60000 [========] - 4s 70us/sample - loss: 0.5032 - accuracy: 0.8234
Epoch 2/10
60000/60000 [========] - 4s 64us/sample - loss: 0.3793 - accuracy: 0.8618
...
Epoch 10/10
60000/60000 [========] - 4s 66us/sample - loss: 0.2389 - accuracy: 0.9115

最终达到了88%左右的准确率。

评估准确率

接下来,看看在测试集中表现如何?

1
2
3
4
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('\nTest accuracy:', test_acc)
# 10000/10000 [========] - 0s 37us/sample - loss: 0.3610 - accuracy: 0.8777
# Test accuracy: 0.8777

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

预测

使用predict函数进行预测。

1
2
predictions = model.predict(test_images)
predictions[0]

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

1
2
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,预测正确。

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

返回文档首页

参考地址:Train your first neural network: basic classification

本站永久域名geektutu.com,也可搜索「 极客兔兔 」找到我。

期待关注我的知乎专栏,所有文章可在「 知乎APP 」查看。


标签:

专题:

发表于2019-07-09 00:30:10,最后修改于2019-07-12 23:28:09。

本站文章欢迎链接分享,禁止全文转载。


« 上一篇 TensorFlow 2 / 2.0 中文文档 下一篇 » TensorFlow 2 中文文档 - IMDB 文本分类

赞赏支持

请我吃胡萝卜 =^_^=

i ali

支付宝

i wechat

微信

推荐阅读

Big Image