在机器学习 tensorflow 2 的hello world 一文里,介绍了一个最简单的tensorflow 2编程。本文就在其的基础上,来个实际的例子:图像分类。
总共包含10个类别中的70,000个灰度图像。使用60,000张图像来训练网络,用10,000张图像让机器判断,以评估网络学习图像分类的准确程度。当然这些图像都是现成提供,用于我们学习。
原始的代码和教程
英文:https://tensorflow.google.cn/tutorials/keras/classification
中文:https://blog.csdn.net/qq_20084101/article/details/81984312
1:下载数据
在程序开头,我们包含基本包,显示版本号。
然后fashion_mnist = keras.datasets.fashion_mnist 准备下载 Fashion MNIST库里的数据
下面(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
这个语句导入数据库里的数据到 (train_images, train_labels), (test_images, test_labels)
图像images(train_images,test_images)是28x28 NumPy数组,像素值介于0到255之间。
标签labels(train_labels,test_labels)是一个整数数组,范围从0到9.这些对应于图像所代表的服装类别。
再下面代码是10个服装类别的名字列表class_names。
#导入基本包
from __future__ import absolute_import, division, print_function, unicode_literals
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras
# Helper libraries
import numpy as np
import matplotlib.pyplot as plt
#显示版本号
print(tf.__version__)
#下载数据
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 10个分类
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
#显示数据集中结构
print(train_images.shape)
print(train_labels.shape)
print(test_images.shape)
print(test_labels.shape)
我们运行这一段代码,然后来分析数据集
2:探索数据集
程序运行结果如下:
2.0.0
(60000, 28, 28)
(60000,)
(10000, 28, 28)
(10000,)
版本号是2.0.0
训练集中train_images有60,000个图像,每个图像表示为28 x 28像素,训练集中train_labels(结果)有60,000个元素。
测试集中test_images有10,000个图像,每个图像表示为28 x 28像素,测试集中test_labels(结果)有10,000个元素。
在shell 或者命令区 train_labels, 显示内容为 0-9 的一个数组,test_lables 也一样。
train_labels
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)
test_labels
array([9, 2, 1, ..., 8, 1, 5], dtype=uint8)
这就是我们看到数据集内容的情况。
3: 数据处理
继续看代码,下面第一段代码是图示化显示一个图形的内容,其实还是数据探索,这里选取train_images[0] 作为观察对象,其实可以任选一个。结果如下:
观察的结果是数据都是0到255 之间
接下来进行归一化处理,就是/255 ,使数据都是0和1 之间的数据。
最后这段代码是探索数据的内容。抽取前面25个图形,用5行5列的方式显示,每个图对应他的标签:
# 这段代码就是显示train_images[0]单元的内容,图示化显示,你可以改0为0-59999之间的数据
# 对程序没影响,和上面的print 差不多
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
#归1化处理,数据只是0和1 之间的数据
train_images = train_images / 255.0
test_images = test_images / 255.0
# 这段代码也是显示数据内容的作用
# 显示5行5列 训练数据的内容train_images[i],标签的内容train_babels[i]
plt.figure(figsize=(10,10))
# 25 个数据组
for i in range(25):
#图是5行5列
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(class_names[train_labels[i]])
plt.show()
4:建立模型,设置网络层
建立神经网络需要的网络层(layer)
深度学习包括将简单层链接在一起。大多数层,像 tf.keras.layers.Dense
都有在训练期间需要学习的参数。
模型网络中的第一层,tf.keras.layers.Flatten
,将图像的格式从 2 维数组(28 x 28 像素)转换为 28 * 28 = 784 像素的一维数组。该层将图像像素展开,并进行排列。该层没有要学习的参数,它只重新格式化数据。
在像素展开为一维之后,网络由两层 tf.keras.layers.Dense
序列组成。这些是密集连接或全连接的神经网络层。第一个 Dense
层有 128 个节点(或神经元)。第二(最后)层是一个 10 节点的 softmax 层 —— 返回有 10 个概率分数的数组,其总和为1。每个节点包含指示当前图像属于 10 个类之一的概率。
# 建立模型 设置网络层
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
5:编译模型
模型训练前,还需要设置一些参数,这是在compile 这设置的。
优化器(Optimizer)—— 基于数据以及损失函数更新模型的方式,这里是adam。
损失函数(Loss function)—— 衡量模型在训练过程中的准确性。我们希望最小化此函数,以便在正确的方向上“引导”模型。
指标(Metrics)—— 监控训练和测试步骤。以下示例使用 accuracy,即正确分类的图像比例。
# 编译模型 优化器 损失函数 指标
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
6:训练模型
培训模型,需要提供数据,输入数据train_images,结果数据train_labels。然后还要提供培训的次数(epochs=10)
# 训练模型 10次
model.fit(train_images, train_labels, epochs=10)
看看最后10次培训的运行结果:
第一次培训后准确度是:0.8244,10次后准确度是:0.9105
7:评估准确率
接下来,评估下准确度,test_images 有10,000个样本,然后test_labels有10,000个标签结果。看看预测精度是多少?
结果是:accuracy: 0.8797
#评估准确率
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
8:作出预测
最后我们看看他的预测结果:
对于第1个test_images[0],预测结果是:
[1.3200014e-06 6.6916939e-09 6.0126450e-09 1.8611319e-09 3.2168753e-06
1.2872049e-03 9.4451207e-07 5.1744631e-03 3.1951959e-07 9.9353254e-01]
这是一个概率预测表列,总和为1, 最后1项最大为 0.993,概率最大,也接近1,所以预测为9
print (test_labels[0])
9
预测对的。
#预测
predictions = model.predict(test_images)
print(predictions[0])
这个例子就介绍到此,这是一个基本教程,对网络层,和编译参数还不是特别理解。在后面的学习和实践中再理解。