机器学习 TensorFlow2.0 教程-图像分类

机器学习 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])

这个例子就介绍到此,这是一个基本教程,对网络层,和编译参数还不是特别理解。在后面的学习和实践中再理解。

发布了131 篇原创文章 · 获赞 112 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/leon_zeng0/article/details/102737583