机器学习基础:第 5 部分 – 对真实世界图像进行分类

在本文中,我们将研究如何

使用卷积神经网络对复杂特征进行分类。在之前的第 4 部分 –  使用卷积神经网络进行编码中,您学习了有关 CNNS 的知识。您还了解了如何改进您之前创建的时尚分类器。

因此,在这一部分中,我们将看看是否可以将其应用于其他类似的图像这是一组马和人的数据集,其中包含许多不同马的不同姿势的图片,以及不同姿势的非常多样化的人的图片。

举个例子,看看中间上方

的那匹马。你只能看到它的三条腿。在最下方的那匹马中,你只能看到两条腿。男人和女人的姿势也各不相同。有些人的身体某些部分被遮住了。比如穿红裙子的女人实际上是从膝盖处被截断的。

如您所见,这个问题比时尚 mnist 和手写数字的问题更具挑战性,因为其中每个物品的姿势都相似。在开始编写网络代码之前,我们需要做的第一件事是找到一种简单的方法来标记这些图像,这样我们就可以告诉计算机哪些是马,哪些是人。

TensorFlow 支持的一种简化操作方

达卡的移动信息 孟加拉国首都达卡拥有广泛的 马来西亚移动数据 蜂窝数据接入,因为主要电信公司以合理的价格提供 4G 服务。该市的数字基础设施正在发展,增加了移动互联网的覆盖范围和速度。随着对数据的需求不断增长,人们正在尝试推出 5G 服务,这将使达卡成为孟加拉国的主要连接中心

法是使用子目录。因此,如果我有一个图像主目 hubspot 营销自动化:需要了解的 6 个功能 录,然后将其细分为训练和验证图像,训练目录包含名为“马”和“人”的子目录 – 每个子目录都包含相应的图像,其中“马”位于“马”目录中,“人”位于“人”目录中 – 同样,如果我有一个验证目录,子文件夹中包含“马”和“人”,那么我现在就有了一套完全标记的图像用于训练和测试。

使用 TensorFlow,我可以将这些目录传递给一个叫做生成器的东西。它会根据目录名自动标记图像。

此标记是使用 Keras 库中的图像数据生成器实现的。您可以像这样导入它。

然后您可以使用它对

图像进行一些转换,例如对其进行规范化。

# 所有图像将按 1./255 重新缩放


# 使用 train_datagen 生成器以 128 个批次的形式对流训练图像进行处理
训练生成器 = 训练数据生成器.flow_from_directory(
        '/tmp/horse-or-human/' ,   # 这是训练图像的源目录
           # 所有图像将调整为 150x150
        大小 batch_size= 128 ,
         # 由于我们使用 binary_crossentropy 损失,我们需要二进制标签
        class_mode= 'binary' )

这是一个非常简单

的标准化,我只需将每个通道除以 255。有更好的方法 bmb目录 可以做到这一点。但我现在先简单介绍一下。然后,通过调用flow_from_directory方法将图像从目录中流出,为图像创建一个生成器。指定包含标签子目录的目录。

例如,在本例中,我们正在进行训练。因此,这将是包含马和人类子目录的训练目录。使用其中一个目录是常见的做法。请确保使用父目录。

您需要指定生成器稍

后将提供给模型的图像的大小。还记得我们制作时尚图像时,它们都是 28×28 的。使用真实世界图像时,不能保证它们都是相同的大小。因此,当从目录中流出它们以及重新缩放时,最好也调整它们的大小。您可以指定训练的批量大小。例如,在这种情况下,它们将一次从目录中取出 128 张,以便输入到神经网络中。

最后,还有class_mode。请注意这一点,因为它很容易产生错误。如果您只有两个类,就像我们这里一样,请将其保留为二进制。如果您有更多类,则应将其保留为分类。

对于您的验证数据集,您执行的操作完全相同,只是您要创建一个验证生成器并将其指向验证目录。

validation_datagen = ImageDataGenerator(重新缩放= 1 / 255 )

# 使用 train_datagen 生成器以 128 个批次的形式对流训练图像进行处理
验证生成器 = 验证数据生
        ',   # 所有图像将调整为 150x150y 损失,我们需要二进制标签
        class_mode= 'binary' )
这两个生成器现在提供

模型可用于训练和验证的图像。现在是时候定义可以使用这些图像的模型架构了。稍后,我们将看到在将图像与标签匹配时如何使用它们。

这是可以对马和人类图像进行分类的简单 CNN 代码。


])
现在看起来应该有点

熟悉了。首先是几个堆叠的卷积层,每个卷积层后面都有一个最大池化层,就像我们在上一部分中看到的那样。每层中的卷积数量完全是任意的。您可以尝试获得最佳结果。我在这里通过随着图像大小的减小而增加过滤器的数量来实现这一点。请记住,池化层是图像大小的四分之一。因此,在较小的图像上,我尝试了更多的过滤器。但您可以自由地进行实验。

不过,请记住输入形状。这非常重要。在这里,我们告诉初始层预期以 300x300x3 格式输入数据。因此,每幅图像都是 300×300 像素。每个像素有三个字节。这需要与您之前在生成器中指定的大小相匹配。

最后是输出层。神经元的数量应与类别数量相匹配。但有一个例外。使用二元分类器,你只需一个神经元和一个sigmoid激活函数即可。这会将一个类别的值推向 0,将另一个类别的值推向 1。

如果我们看一下我们的模型架构,我们会看到类似这样的内容。

模型:“顺序”
   

图像在各个层中的旅程显而易见。它从 300×300 开始,丢失一个像素边框变成 298×298,通过池化在每个维度上减半变成 149×149,然后丢失另一个像素边框,等等等等。总的来说,这个网络需要学习大约 4000 万个参数。所以训练可能需要一点时间。

当你编译模型时,你指定一个损失函数和一个优化器。

tensorflow.keras.optimizers导入RMSprop

模型.编译(loss= 'binary_crossentropy'
              优化器=RMSprop(lr= 0.001),
              指标 = [ '准确度' ])

在这种情况下,我们将使用一个名为 的损失函数binary_crossentropy。这是二元分类时常用的函数。我们还将使用一个名为 的优化器RMSprop,它能够接受称为学习率的参数。从 0.001 开始。您可以随时调整它。我们将在训练时捕获准确率矩阵。

学习率参数定义了 Transformer 中的数学函数如何使用所谓的梯度下降进行学习。详细讲解这一点超出了本教程的范围。

现在到了进行训练的时间了。

历史= 模型.fit(
      训练生成器验证数据= 验证生成器,  
       epochs = 15详细= 2 )

如果您熟悉model.fit我们之前看到的,我们在使用生成器时指定了数据和标签,您所要做的就是指定生成器。它会从提供的子目录中推断出标签。您可以在这里看到。我的训练数据。它有训练生成器提供的图像和标签。我只会对它进行短暂的训练,15 个时期。您将看到这个模型的表现如何。验证数据将来自验证生成器。与训练一样,它将获取图像和标签。详细参数只是告诉 TensorFlow 每个时期要报告多少细节。

如果您还记得,我们指定了训练生成器,并定义了批处理大小以从目录中传输图像。您还可以指定训练的批次。您会发现训练速度会大大加快。需要进行一些实验才能获得正确的组合。但是当我没有使用任何组合时,使用 Colab,即使使用 GPU,每个时期也要花费很多时间。但是,如果我指定训练时要使用的步数,它会大大提高性能,使每个时期花费的时间少于 10 秒。所以在训练时要注意这一点。

这是设置了步骤的代码。

历史= 模型.fit(
      训练生成器验证数据= 验证生成器,  
       epochs = 15steps_per_epoch = 8验证步骤= 8详细= 1 )

这里的经验法则是考虑数据集中的项目数量,然后将其除以批大小。如果你还记得之前,我们的批大小是 128。数据集中有 1,024 多个项目。所以我选择了步长 8。

经过 15 个时期后,该模型在训练集上的准确率应接近 100%,在验证集上的准确率应达到 85% 左右。这称为过度拟合。这是神经网络中常见的错误,会让你产生虚假的安全感。实际情况是,网络在对已经见过的数据进行分类时表现得非常非常好,几乎完美。这就是训练数据。但它在理解之前没见过的数据(例如验证数据集中的内容)方面就不那么好了。

这有点像你一生中见过的唯一一双鞋子是登山靴。那么,你可能认不出高跟鞋是鞋子。你过度拟合了自己,认为所有的鞋子看起来都像登山靴。神经网络中有一些技术可以避免这种情况。我们很快就会看到其中的一些。但在此之前,让我们先探索一下如何使用你刚刚创建的网络对图像进行分类。

以下是将图像上传到 Colab 并让其使用模型预测图像内容的代码。

google.colab导入numpy作为np
keras.preprocessing导入文件
导入图像


这仅适用于 Colab。您可以导入文件库来使用它。并通过调用获取已上传文件的列表files.upload。然后,对于每个上传的文件,您必须将其转换为 300×300,将其转换为数组,然后调用expand_dims以确保它是一个三维数组,第三个元素是我们在定义模型时看到的颜色深度。

将图像放入列表后,您可以调用model.predict以获取结果。如果值大于 0.5,则为人。否则,为马。

下一篇:第 6 部分 –卷积猫和狗

 

机器学习 毫升 TensorFlow Python 编程 深度学习 人工智能

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部