9.奖励:使用 Keras 进行卷积神经网络训练

事实上,使用标准的前馈神经网络进行图像分类并不是最好的解决方案。
相反,使用卷积神经网络 (CNN) 更有意义,该网络旨在处理像素强度并学习判别滤波器以高精度对图像进行分类。
在本节中,我们将使用 VGGNet 的较小版本(我们称之为“SmallVGGNet”)。
类似 VGGNet 的模型有两个共同特征:
仅使用 3×3 卷积滤波器
卷积层与子采样层交替。
让我们开始实现 SmallVGGNet。

打开smallvggnet.py文件并将以下代码粘贴到其中:

您可能已经注意到,SmallVGGNet 所需的一切都是从 Keras 导入的。每个模块都可以在Keras 文档中找到。
现在让我们定义SmallVGGNet类(第 12 行)和构建方法(第 14 行):
该组件需要4个参数:输入图像的宽度( width )、高度( height )、深度( deep )和类的数量( classes )。
深度也可以解释为通道的数量。由于我们使用 RGB 图像,因此在调用构建方法时我们将传递深度 = 3。
首先,我们初始化 Sequential模型(第 17 行)。
然后我们确定通道的顺序。 Keras 支持“channels_last” (TensorFlow) 和“channels_first” (Theano)。第 18-25 行允许您使用其中任何一个。

现在让我们向网络添加几个层:

在此块中,添加了CONV => RELU => POOL层。
第一个CONV层有 32 个 3×3 滤波器。
我们为第一层指定inputShape非常重要,因为所有后续层的大小都将使用滴流方法计算。
在此网络架构中,我们将使用 ReLU(修正线性单元)激活函数。还将使用以下内容:Batch Normalization、MaxPooling 和 Dropout。
批量归一化允许您缩放输入数据以将其传递到网络的下一层。该方法被证明可以有效稳定并减少CNN训练步骤数。
应用POOL层来逐渐减小输入层的尺寸(即宽度和高度)。通常,在 CNN 架构中, POOL层插入到连续的CONV层之间。

消除方法使层之间的随机神经元失活

结果,过程变得更加稳定:过度拟合减少,准确度提高;神经网络将能够更好地识别不熟悉的图像。在我们的例子中(第 33 行),每次训练迭代的层之间有 25% 的神经连接被随机停用。
让我们继续下一层:

让家庭和社区能够尽管相距遥远但仍能保持更紧密的联系。此外,电报为未来的通信技术进步奠定了基础。它为电话的发展铺平了道路,随后是互联 电报数据 网的发展,从根本上改变了人类的互动。电报数据的收集和分析引入了数据传输的概念。

请注意,过滤器尺寸保持不变 (3×3),但过滤器总数从 32 个增加到 64 个。
然后是一组层
同样,滤波器的数量从 64 个增加到 128 个,但大小保持不变。增加滤波器总数同时减小 CNN 中输入数据的大小是一种常见的做法。

电报数据

最后,最后一组图层

中的全连接层称为Dense。最后一层连接到三个输出(因为我们的数据集具有三个类别)。 softmax 层返回每个标签属于某个类别的概率。
现在我们已经实现了 SmallVGGNet 神经网络,让我们编写一个脚本来在 Animals 数据集上训练它。
大部分代码与前面的示例相同。打开train_vgg.py脚本:
所有导入都是相同的,但有两个区别:
我们加载 SmallVGGNet 模型,而不是数据将使用ImageDataGenerator进行扩充。
现在命令行参数:
我们看到参数与前面的示例中的相同。
我们加载并预处理数据:
同样几乎没有区别。

我们将数据分为训练样本和测试样本并对标签进行二值化:

testY = lb.transform(testY)
现在让我们添加数据:
在第 75-77 行,我们初始化生成器以添加图像。
这将使我们能够通过旋转、移动、裁剪和放大图 美国手机号码列表 像从现有数据中创建额外的训练数据。
补充数据将避免过度拟合并提高模型的效率。建议您始终执行此操作,除非有明确的理由不这样做。
为了构建我们的 SmallVGGNet,我们只需调用SmallVGGNet.build方法,同时传递必要的参数(第 80 和 81 行)。

让我们编译并训练模型:

该过程与前面的示例几乎相同,只是由于我们要填充输入,因此调用model.fit_generator方法而不是model.fit。生成器将根据之前指定的设置创建批量的附加训练数据。
最后,我们通过绘制损失/准确率曲线来评估模型并保存:
我们对测试集进行预测,然后评估分类准确性(第 103-105 行)。
构建图形、模型和标签并将其保存到磁盘与前面的示例类似。
让我们继续训练我们的模型。打开终端并运行以下命令:
确保输入所有命令行参数。
对CPU的训练将需要相当长的时间——75个步骤中的每一个都需要一分多钟,整个过程将持续大约一个半小时。
GPU 将更快地完成该过程 – 每个步骤只需 2 秒即可完成,如图所示。

让我们看看output/目录中的最终训练图:

正如您所看到的,我们使用卷积神经网络在动 保障您的投资安全:使用我们的加密钱包随时了解比特币的实时价格 物图像集上实现了 78% 的准确率 – 显着高于之前的 60% 值。
现在我们可以将训练好的 CNN 应用于新图像:
CNN 完全确信这是一只熊猫。
CNN 算法用于图像搜索,例如在 Google Photo 中,但照片识别和分类并不是使用卷积神经网络的唯一示例:它们也很好地展示了自己,例如在自然语言处理 (NLP)中任务。

源代码

本文的代码和数据集可以从此处下载(存档大小 246 MB)。
继续分享您的结果,如果有不清楚的地方,请在评论中提问,我们会回答并帮助您解决问题。我们也很高兴收到您对未来文章主题的建议 – 写下您想阅读的内容。
原始文章可以在pyimagesearch.com找到。

发表评论

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