之前的helloworld用的是mnist作为数据集,今天真正意义上的第一个tf2.0程序,用得是官方准备的服装数据集。https://tensorflow.google.cn/tutorials/keras/basic_classification
from __future__ import absolute_import, division, print_function, unicode_literals
# 导入TensorFlow和tf.keras
import tensorflow as tf
from tensorflow import keras
# 导入辅助库
import numpy as np
import matplotlib.pyplot as plt
代码使用Fashion MNIST 数据集,其中包含了10个类别中共70,000张灰度图像。图像包含了低分辨率(28 x 28像素)的单个服装物品。
代码使用60,000张图像来训练网络和10,000张图像来训练和测试模型。导入图片集代码如下:
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
train_images和train_labels是训练用数据,其后两个是测试数据。
图像是28x28 NumPy数组,像素值介于0到255之间。labels是一个整数数组,数值介于0到9之间。这对应了图像所代表的服装的类别。
把图像的类别存储下来备用:
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
数据预处理(不能不说大厂就是机智,还搞预处理):
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
我们把训练集的第一张图片拿出来看一下,结果如下:
我们可以看到,图片的灰度值是在0到255之间,这会减慢梯度下降法的运行速度,所以我们把灰度值除以255来加速(否则连准确率都会受到很大的影响,大概就是不归一化的话,正确率十分之一,和猜没有区别):
train_images = train_images / 255.0 # 不过这种语法确实神奇
test_images = test_images / 255.0
显示前25张图片及其label,确定我们的读入没有问题:
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1) # 将画图划分出5*5的区域
plt.xticks([]) # x坐标轴设为空,即不显示
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(class_names[train_labels[i]])
plt.show()
接下来我们开始构建模型。
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
网络中的第一层 tf.keras.layers.Flatten
将图像格式从一个二维数组(包含着28x28个像素)转换成为一个包含着28 * 28 = 784个像素的一维数组。可以将这个网络层视为它将图像中未堆叠的像素排列在一起。这个网络层没有需要学习的参数;它仅仅对数据进行格式化。
在像素被展平之后,网络由一个包含有两个tf.keras.layers.Dense
网络层的序列组成。他们被称作稠密链接层或全连接层。 第一个Dense
网络层包含有128个节点(或被称为神经元)。第二个(也是最后一个)网络层是一个包含10个节点的softmax层—它将返回包含10个概率分数的数组,总和为1。每个节点包含一个分数,表示当前图像属于10个类别之一的概率。
编译模型:
通过编译,我们可以设定训练的以下属性:
训练模型:
1.将训练数据提供给模型 - 在本案例中,他们是train_images
和train_labels
数组。
2.模型学习如何将图像与其标签关联
3.使用模型对测试集进行预测, 在本案例中为test_images
数组。我们验证预测结果是否匹配test_labels
数组中保存的标签。
通过调用model.fit
方法来训练模型 — 模型对训练数据进行"拟合":
model.fit(train_images, train_labels, epochs=5)
接着,我们可以测试模型:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
最后,我们还可以通过训练好的模型对某几张我们感兴趣的图片进行预测:
predictions = model.predict(test_images)
需要注意的是,单张图片的格式为[28, 28],所以我们如果想单独测试一张网上找到的照片,需要把它存成一个序列:
img = test_images[0]
img = (np.expand_dims(img,0))
predictions_single = model.predict(img)
print(predictions_single)
prediction_result = np.argmax(predictions_single[0]) # 用argmax获得更直观的结果
print(prediction_result)
最后的测试效果还可以吧:
32/10000 [..............................] - ETA: 9s - loss: 0.2578 - accuracy: 0.9375
800/10000 [=>............................] - ETA: 0s - loss: 0.3455 - accuracy: 0.8838
1696/10000 [====>.........................] - ETA: 0s - loss: 0.3303 - accuracy: 0.8774
2592/10000 [======>.......................] - ETA: 0s - loss: 0.3262 - accuracy: 0.8789
3552/10000 [=========>....................] - ETA: 0s - loss: 0.3477 - accuracy: 0.8727
4384/10000 [============>.................] - ETA: 0s - loss: 0.3481 - accuracy: 0.8716
5248/10000 [==============>...............] - ETA: 0s - loss: 0.3513 - accuracy: 0.8723
6208/10000 [=================>............] - ETA: 0s - loss: 0.3555 - accuracy: 0.8711
7168/10000 [====================>.........] - ETA: 0s - loss: 0.3531 - accuracy: 0.8723
8032/10000 [=======================>......] - ETA: 0s - loss: 0.3462 - accuracy: 0.8748
8960/10000 [=========================>....] - ETA: 0s - loss: 0.3491 - accuracy: 0.8740
9888/10000 [============================>.] - ETA: 0s - loss: 0.3451 - accuracy: 0.8749
10000/10000 [==============================] - 1s 65us/sample - loss: 0.3450 - accuracy: 0.8749
Test accuracy: 0.8749