【TensorFlow 2.0教程】训练第一个神经网络:图片分类

  • A+
所属分类:TensorFlow 2.0

本教程将训练一个神经网络模型来对衣服图片进行分类,比如运动鞋和衬衫。这是一个完整的机器学习示例,完成本教程后,你就可以在此基础上使用TensorFlow处理实际的分类问题。你也将看到使用TensorFlow 2.0处理此类问题是多么的直观和简单。

本教程同样会使用keras的高级API,在TensorFlow中构建和训练模型。从TensorFlow 2.0开始,使用keras高级API进行编程已经成为首选,因为它从更高层次抽象了底层API,从而极大地简化了开发。

首先,导入本教程将使用的库:

导入数据集

本教程将使用Fashion MNIST数据集,其中包含10个类别,以及70000张灰度图片。图片显示的是低分辨率(28×28像素)的衣服,如下图所示:

【TensorFlow 2.0教程】训练第一个神经网络:图片分类

Fashion MNIST数据集是经典MNIST手写数字数据集的替代——现在通常被用作计算机视觉机器学习的“Hello, World”程序。经典MNIST数据集包含手写数字(0、1、2等)的图片,其格式与我们将在这里使用的衣服图片相同。

本教程之所以使用Fashion MNIST数据集,因为对这个数据集的分类比普通MNIST手写数字数据集更具挑战性。这两个数据集都相对较小,一般用于验证算法,它们都是用于测试和调试代码的一个比较好的起点。

我们将使用60000张训练图片来训练神经网络模型,并使用10000张图片来评估模型对图片分类的准确率。我们可以直接从TensorFlow获取Fashion MNIST,以下代码从TensorFlow导入和加载Fashion MNIST数据:

加载的数据集包含4个Numpy数组:

  •  和  数组是训练数据集,也就是用来训练模型的数据。
  •  和  数组是测试数据集,模型将使用它们进行测试。

数据集中的图片都是28x28的NumPy数组,像素值从0到255。标签是一个整数数组,值从0到9,对应于图片所代表的服装类别:

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

每张图片都映射到了一个0到9的数字标签,而没有映射到类别名称。由于数据集中没有包含各个类别的名称,所以我们可以事先将它们存储起来,以便稍后画图时使用:

探索数据

在训练模型之前,让我们先研究一下数据集。如下所示,训练集中有60000张图像,每张图像表示为28x28像素:

同样,训练集中有60000个标签:

每个标签都是0到9之间的整数:

测试集中有10000张图片,同样,每张图片用28×28像素表示:

测试集包含10000张图片的标签:

标签值同样是0到9之间的整数:

预处理数据

在训练网络之前,必须对数据进行预处理。如果你检查训练集中的第一张图片,你会发现像素值在0到255之间:

【TensorFlow 2.0教程】训练第一个神经网络:图片分类

在将这些值输入神经网络模型之前,我们将这些值缩小到0到1的范围。为此,我们将值除以255。值得注意的是,训练集和测试集必须以相同的方式进行预处理:

为了验证数据的格式是否正确,以及我们是否准备好构建和训练神经网络模型,让我们显示训练集中的前25张图片,并在每张图片下面显示类别名称。

【TensorFlow 2.0教程】训练第一个神经网络:图片分类

构建模型

当我们构建神经网络时,需要对模型的层进行配置,然后对模型进行编译。

配置模型层(layer)

一个神经网络的基本构件是层(layer)。层从输入的数据中提取表示(representation),并希望这些被提取的表示对正在处理的问题具有意义。

大多数深度学习都是由一系列简单的层次链组成的。如  的大多数层都将在网络的训练中学习到参数。我们依然使用  层叠模型构建一个全连接网络:

网络的第一层是  ,该层将图像的格式从二维数组(28×28像素)转换为一维数组(28 * 28 = 784像素)。将这个层看作是将图像中的像素行分解并排列起来。这一层没有需要学习的参数,它只重新格式化数据。

当图片像素被平铺后,网络由两个 紧凑层组成。它们是紧密相连的,或者说全连接层。第一个Dense层有128个节点(或神经元),第二个(也是最后一个)Dense层是一个10个节点的  层,它返回一个由10个概率值组成的数组,其和为1。每个节点包含一个评分值,表示当前图片属于10个类别中的一个的概率。

编译模型

在模型准备好训练之前,它需要一些设置,这些设置是在模型的“编译”阶段完成的:

  • 指定“损失函数”(Loss function):测量模型在训练过程中有多精确。我们需要最小化这个函数来“引导”模型朝着正确的方向。
  • 指定“优化器”(Optimizer) :这是模型根据所看到的数据及其损失函数更新模型参数的方法。
  • 指定“度量”参数(Metrics) :用于监测训练和测试步骤。下面的例子使用准确率(accuracy),即被正确分类的图片比例。

训练模型

训练神经网络模型需要以下步骤:

  1. 将训练数据提供给模型。在本例中,训练数据为  和  数组。
  2. 模型不断学习,将图像和标签关联起来。
  3. 使用模型对测试集做出预测,在这个例子中,测试集是  数组,我们需要验证预测结果与  数组中的标签是否匹配。

要对模型进行训练,我们需要调用  函数——之所以该函数叫fit,是因为它将模型与训练数据进行“匹配”:

在模型训练过程中,损失值与准确率这两个指标会被显示。可以看到最终该模型对训练数据的准确率达到了约0.88(88%)。

评估模型准确率

接下来,我们看看模型在测试数据集上的性能:

结果表明,测试数据集的准确率略低于训练数据集的准确率,这表示“过拟合”了。“过拟合”是指机器学习模型在新的、以前没见过的输入上的表现比在训练数据上差。

使用模型进行预测

通过已训练的模型,我们可以用它来对新的图片进行预测。

这里,我们用模型预测了测试集中的所有图片,让我们看一下第一个图片的预测结果:

每个图片的预测结果都是由10个数字组成的数组,它们表示了图片属于10个类别中的每个类别的“置信度”。我们可以看看哪个标签的置信度最高:

因此,模型最确信的标签是9,  是一双踝靴(ankle boot)。我们检查一下第一个图片的测试标签,也是9,因此模型正确地预测了该图片的分类:

我们可以通过画图来查看完整的10个类别的预测值。

让我们看看第1张图片(索引为0)的预测结果和预测数组:

【TensorFlow 2.0教程】训练第一个神经网络:图片分类

再随机看看某个图片:

【TensorFlow 2.0教程】训练第一个神经网络:图片分类

我们也可以画出更多的图片。正确的预测标签是蓝色的,错误的预测标签是红色的。预测结果数组中的数字表示预测为某标签的百分比(满分为100),比例越高,表明模型认为图片属于某个类别的可能性越大。请注意,即使置信度非常高,也不代表预测结果是对的。

【TensorFlow 2.0教程】训练第一个神经网络:图片分类

最后,我们利用训练后的模型对单个图片进行预测。

TensorFlow的模型被优化从而可以一次性对一批或一组样本进行预测。因此,即使我们想要预测的是一张图片,我们也需要将它添加到列表中:

现在,我们可以预测这张图片的正确标签了:

【TensorFlow 2.0教程】训练第一个神经网络:图片分类

 函数返回一个列表的列表——其中一个列表对应批次数据中的一个图片。

如下,获取我们所预测(单个)的图片的预测结果:

和之前一样,该模型预测的标签为9。

本文完整代码请参考这里

  • 微信
  • 如有疑问,请加个人微信联系
  • weinxin
  • 关注公众号:新码农客栈
  • 有趣的灵魂在等你
  • weinxin
yglong

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: