TensorFlow 基础学习 – 2

2022-02-21

我们来看这样一个场景,让计算机识别不同的服装单品(包包、鞋子、裤子等10类单品)。我们将使用包含 10 种不同类型物品图像的数据集来训练神经网络进行分类。

数据导入

首先,可以通过tf.keras的API直接获取MNIST数据集。

在 mnist 对象上调用方法会返回两个元组,每个元组包含两个列表。这些列表存储训练和测试图像数据以及服装项目的标签值。

为什么会有两组数据?

我们可能想知道为什么会有两组数据——训练集和测试集。还记得我在介绍中说的话吗?基本思想是使用一组数据进行训练,然后使用另一组数据来评估模型在分类值方面的表现。测试数据必须是模型还没有看到的东西。毕竟,当你完成模型的训练后,你肯定会想用它以前没有见过的数据来尝试一下!

from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(train_iamges, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

得到4个变量,一个A训练集和一个测试集。

我们来看看具体内容。

import matplotlib.pyplot as plt
plt.imshow(training_images[42])

归一化

我们会注意到 All 值在 0 到 255 之间。如果我们正在训练神经网络,如果我们将所有值都处理在 0 到 1 之间,则更容易获得更好的训练结果,原因有很多这个过程称为“规范化”……幸运的是,很容易规范化这样的列表而无需循环。你可以这样做:

实际上,只需将矩阵中的每个数字除以 255 即可。

training_images  = training_images / 255.0
test_images = test_images / 255.0

模型设计

我们可能想知道为什么会有两组数据——训练集和测试集。还记得我在介绍中说的话吗?基本思想是使用一组数据进行训练,然后使用另一组数据来评估模型在分类值方面的表现。测试数据必须是模型还没有看到的东西。毕竟,当您完成模型的训练后,您想用从未见过的数据进行尝试!

现在让我们设计 MNIST 分类模型。这里有很多新概念,但别担心,我们会掌握它们的。

model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), 
                                    tf.keras.layers.Dense(128, activation=tf.nn.relu), 
                                    tf.keras.layers.Dense(10, activation=tf.nn.softmax)])

或者用下面的方法设计模型,效果是一样的

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(128, activation=tf.nn.relu))
model.add(keras.layers.Dense(10, activation=tf.nn.softmax))

Relu 的意思是“如果 X > 0 返回 X,否则返回 0”——所以它的作用就是只将大于 0 的值传递给网络中的下一层,小于 0 的也被处理为 0。

激活函数接收到一组值后,选择最大的一个输出。比如上一层的输出是[0.1, 0.1, 0.05, 0.1, 9.5, 0.@ >1 , 0.05, 0.05, 0.05],这样我们就可以找到其中的最大值并将其转换为 [0,0,0,0,0 ,1 ,0,0,0,0,0] 的意思是“如果 X>0,返回 X,否则返回 0”——所以它的作用就是只将 0 或更大的值传递给下一层网络。 –目的是节省大量编码!

现在模型已经定义好了,接下来要做的就是实际构建它。它可以像以前一样使用优化器和损失函数进行编译 – 然后通过调用 model.fit 进行训练,要求它将训练数据拟合到标签 – 即让模型找出训练数据和标签之间的关系。一旦经过训练,它将能够以与训练数据相同的格式对新数据进行预测,但从未“见过”。

培训

model.compile(optimizer = tf.optimizers.Adam(),
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)

一旦模型完成训练——它可以在 epoch 结束时看到一个准确度值。这告诉我们,神经网络以大约 81% 的准确率对训练数据进行分类。也就是说,它发现了图像和标签之间的模式匹配,并且 81% 的分类结果是正确的。考虑到只有 5 人接受过培训,而且完成得相当快,这还不错。

这里需要注意的是,损失值降低,准确率提高是正常的。

但是,对看不见的数据进行分类的准确度如何?这就是我们需要测试图像的原因。我们可以称之为模型。并传入图像和标签数据进行测试,它会报告测试数据的损失。让我们试一试。

AMA

数据未标准化?

归一化的目的是消除奇异样本数据带来的不利影响。数据归一化后,最优解的优化过程明显会变得平滑,更容易正确收敛到最优解。

关于规范化,请参考这篇文章:

模型设计的时候,数据没有展平?

没有扁平化,只有 28 层神经元。

在设计模型时,中间层的神经元被替换为更大的数字。结果如何?

训练时间更长,但更准确。通过添加更多神经元,计算机必须进行更多计算,从而减慢训练过程。但是对于这种情况,增加神经元的数量会产生积极的影响——确实获得了更好的准确性。但这并不意味着“越多越好”,因为收益递减规律很快就会遇到。

考虑最后一个(输出)层。为什么有 10 个神经元?如果数字小于 10 会怎样?例如,改为尝试 5 来训练网络

一旦模型发现意外值,就会产生错误。规则是 – 最后一层中的神经元数量应与您要分类的类别数量相匹配。在这种情况下,是数字 0-9,所以有 10 个,所以你的最后一层应该有 10 个神经元。

考虑增加网络层数的效果。如果在第 512 层和第 10 层之间再添加一层会怎样?

回答:没有显着影响——因为这是相对简单的数据。对于更复杂的数据,通常会添加额外的层。

请考虑更改培训课程的数量,这有什么关系?

尝试 15 – 可能会得到比 5 更好的模型,损失更少。尝试 30 – 您可能会看到损失停止下降,有时还会增加。这是一种称为“过度拟合”的副作用,在训练神经网络时需要牢记这一点。如果损失没有改善,浪费时间继续训练是没有意义的

在训练模型时,您可能会想“在达到所需值时停止训练不是很好吗?

–即95%的准确率可能对你来说已经足够了,如果你在3次之后就达到了,为什么还要等它完成更多的训练次数……,那么如何解决这个问题呢?像许多其他类似的程序…使用回调函数!让我们看看它实际上做了什么。

import tensorflow as tf
print(tf.__version__)
class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('loss')<0.4):
      print("nReached 60% accuracy so cancelling training!")
      self.model.stop_training = True
callbacks = myCallback()
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images/255.0
test_images=test_images/255.0
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(training_images, training_labels, epochs=5, callbacks=[callbacks])

分类:

技术要点:

相关文章:

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容