MNIST 图像分类

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

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

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

  1. # TensorFlow and tf.keras
  2. import tensorflow as tf
  3. from tensorflow import keras
  4. # Helper libraries
  5. 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. fashion_mnist = keras.datasets.fashion_mnist
  2. (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. train_images.shape # (60000, 28, 28)
  2. len(train_labels) # 60000
  3. train_labels # ([9, 0, 0, ..., 3, 0, 5], dtype=uint8)
  4. test_images.shape # (10000, 28, 28)
  5. len(test_labels) # 10000

预处理

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

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

搭建模型

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

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

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

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

编译模型

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

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

训练模型

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

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

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

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

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

评估准确率

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

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

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

预测

使用predict函数进行预测。

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

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

  1. array([1.06-05, 5.06-12, 8.44-08, 4.09-09, 2.87-07, 2.28-04,
  2. 6.18-06, 2.48-02, 3.81-06, 9.74-01], dtype=float32)

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

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

返回文档首页

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

附 推荐