
在本系列培训的前几篇文章中,描述了准备数据的可能选项,
包括对图像进行预处理和添加数据 ;在这些文章中,还构建了基于卷积神经网络图像
识别情绪的
基本模型 。
在本文中,我们将建立一种改进的卷积神经网络模型,使用一种称为
归纳学习的技术来识别图像中的情绪。
首先,您需要熟悉有关“
识别图像中的情绪的
基本模型”的文章,在阅读时还可以参考该文章,因为此处将不详细介绍某些部分,包括研究源数据和描述网络指标。
资料
数据集包含1630张具有两类情绪的图像:
负 (类别0)和
正 (类别1)。 下面给出了此类图像的一些示例。
负数

正面的


其中一些示例包含明显的积极或消极情绪,而其他示例则可能无法归类,即使有人参与也是如此。 根据对此类情况的外观检查,我们估计最大可能的准确性应约为80%。 请注意,由于分类的不平衡程度较小,随机分类器可提供约53%的准确性。
为了训练模型,我们使用
持有部分样本的技术,并将初始数据集分为两部分,其中一部分(初始值的20%)将由我们用于验证。 使用
分层进行分区:这意味着在培训和测试集中保持班级之间的平衡。
解决数据不足
基本模型显示了结果,仅略优于图像类别的随机预测。 此行为可能有很多可能的原因。 我们认为,主要原因是可用的数据量绝对不足以进行网络卷积部分的这种训练,而这种训练将允许基于输入图像获得特征。
解决数据不足问题的方法有很多种。 以下是其中一些:
- 重新获取 。 该方法的思想是评估数据的分布并从该分布中选择新的示例 。
- 没有老师的学习 。 每个人都可以在给定的数据集中找到与标记示例具有相同性质的大量数据。 例如,它可以是用于视频识别的电影或用于语音识别的有声读物。 下一步是将这些数据用于模型的预训练(例如,使用自动编码器)。
- 数据扩充 。 在此过程中,将使用给定的一组转换对样本数据进行随机修改。
- 归纳学习 。 我们非常感兴趣这个主题,所以让我们更详细地了解它。
归纳学习
术语
归纳训练是指使用在近似相同性质的不同数据集上训练的模型(通常非常大)的一组技术。


传统机器学习和归纳学习方法的比较。 图片摘自S. Ruder
的博客条目
“什么是归纳学习?” 。
使用归纳学习的
三种主要方案:
- 预训练模型 。 任何用户都可以简单地采用由他人培训的模型并将其用于他们的任务。 如果任务非常相似,则可能出现这种情况。
- 块选择标志 。 至此,我们知道模型的体系结构可以分为两个主要部分: 特征提取单元 ,负责从输入数据中提取特征; 分类模块 ,根据接收到的特征对示例进行分类。 通常,特征提取块是模型的主要部分。 该方法的思想是采取一个步骤,将特征与在另一个问题中训练过的模型区分开来,固定其权重系数(使其不受训练),然后在其基础上针对所考虑的问题构建新的分类模块。 分类模块通常不是很深,由几个完全连接的层组成,因此该模型更容易训练。
- 精确而深入的调整 。 这种方法就像使用特征提取块的场景。 除了“冻结”特征提取块外,执行相同的操作。 例如,您可以将VGG网络用作特征提取模块,并仅在其中的前三个(四个)卷积模块中“冻结”。 在这种情况下,特征提取单元可以更好地适应当前任务。 有关更多信息,请参阅F. Chollet的博客文章使用很少的数据构建强大的图像分类模型 。
可以在斯坦福大学课程
CS231n卷积神经网络(由Fei-Fei Li
进行视觉识别)和S的博客条目中找到有关使用归纳学习的场景的详细说明
。Ruder 归纳学习是发展的下一个前沿领域机器学习 (更全面地讨论主题)。
您可能会有疑问:为什么需要所有这些方法?为什么它们可以起作用? 我们将尝试回答他们。
- 使用大型数据集的好处。 例如,我们可以从对ImageNet竞赛数据集中包含的1400万张图像进行训练的模型中提取特征提取块。 这些模型非常复杂,可以从输入数据中提取非常高质量的特征 。
- 与时间有关的注意事项。 训练大型模型可能需要数周甚至数月的时间。 在这种情况下,每个人都可以节省大量时间和计算资源 。
- 所有这些为何都能起作用的一个重要假设如下:从一项任务的训练中获得的属性可能有用并且适合另一项任务。 换句话说,特征具有关于问题的不变性。 请注意,新任务的域必须与原始任务的域相似。 否则,特征提取单元甚至可能使结果恶化。
增强的模型架构
现在,我们已经熟悉了归纳学习的概念。 我们还知道ImageNet是一个重大事件,几乎所有现代先进的卷积神经网络体系结构都经过了测试。 让我们尝试从这些网络之一中提取特征提取模块。
幸运的是,Keras库为我们提供
了在此平台内创建的
几个经过预训练(通过ImageNet)的模型。 我们导入并使用这些模型之一。

在这种情况下,我们将使用具有VGG架构的网络。 要仅选择特征提取单元,我们通过将
include_top参数设置为
False来删除网络的分类模块(前三个完全连接的层)。 我们还想使用ImageNet中训练的网络权重来初始化我们的网络。 最后一个参数是输入的大小。
请注意,ImageNet竞赛中原始图像的大小为(224,224,3),而我们的图像大小为(400,500,3)。 但是,我们使用卷积层-这意味着网络权重是卷积运算中移动内核的权重。 连同参数分离的属性(在我们的理论文章“
用于对图像进行分类的卷积神经网络概述”中找到对此的讨论)一起,导致输入数据的大小几乎是任意的,因为卷积是通过滑动窗口执行的,并且该窗口可以沿着任何大小的图像。 唯一的限制是输入数据的大小必须足够大,以使其在某个中间层中不会崩溃到一个点(空间测量),因为否则将无法进行进一步的计算。
我们使用的另一个技巧是
缓存 。 VGG是一个非常大的网络。 通过特征提取单元对所有图像进行一次直接传递(1630个示例)大约需要50秒。 但是,应该记住,特征提取单元的权重是固定的,并且对于同一幅图像,直接传递始终会产生相同的结果。 我们可以利用这一事实只执行一次直接通过特征提取单元的操作,然后将结果缓存在中间数组中。 为了实现此方案,我们首先创建
ImageDataGenerator类的实例以直接从硬盘驱动器加载文件(有关更多信息,请参见基本文章
“识别图像中的情绪的基本模型” )。

在下一阶段,我们在预测模式下使用先前创建的特征提取块作为模型的一部分来获取图像特征。

大约需要50秒。 现在,我们可以将结果用于模型的上层分类部分的快速培训-一个时代持续了大约1秒钟。 现在想象一下,每个时代持续50秒以上。 因此,这种简单的缓存技术使我们可以将网络训练过程加快50倍! 在这种情况下,我们将所有示例的所有符号保存在RAM中,因为它的容量足以满足要求。 当使用较大的数据集时,可以计算属性,将其写入硬盘驱动器,然后使用与生成器类关联的相同方法读取它们。
最后,考虑模型的分类部分的体系结构:


请记住,在卷积神经网络特征提取模块的输出处,发出了一个四维张量(示例,高度,宽度和通道),并且用于分类的完全连接层采用了一个二维张量(示例,特征)。 转换具有特征的四维张量的一种方法就是简单地将其围绕最后三个轴对齐(我们在基本模型中使用了类似的技术)。 在这种情况下,我们使用另一种方法,称为
全局平均值子采样 (GAP)。 代替对齐四维向量,我们将基于两个空间维取平均值。 实际上,我们绘制了一个属性图,只是对其中的所有值求平均值。 GAP方法是在Min Lin
网络网上的出色工作中首次引入的(这本书真的很值得了解,因为它讨论了一些重要的概念,例如1×1卷积)。 GAP方法的一个明显优势是参数数量的显着减少。 使用GAP,每个示例仅获得512个特征,在对齐原始数据时,特征数将为15×12×512 = 92160。这可能会导致严重的开销,因为在这种情况下,模型的分类部分将具有约50个特征万参数! 模型的分类部分的其他元素,例如完全连接的层和实现排除方法的层,在
用于识别图像中情感的基本模型一文中进行了详细讨论。
设置和培训选项
使用Keras准备模型的体系结构后,您需要使用编译方法配置整个模型以进行训练。

在这种情况下,除了选择优化程序外,我们使用的设置几乎与基本模型的设置类似。 为了优化学习,将
二进制交叉熵用作损失函数,并另外跟踪精度度量。 我们使用
Adam方法作为优化程序。 Adam是一种具有时刻和自适应
学习速度的随机梯度下降算法(有关更多信息,请参阅S. Ruder的博客文章
“梯度下降优化算法概述” )。
学习速度是优化器的超参数,必须对其进行配置以确保模型可操作。 请记住,“香草”梯度下降的公式不包含其他功能:

Θ是模型参数的矢量(在我们的例子中,它们是神经网络的加权系数),-是目标函数,∇是梯度算子(使用误差反向传播算法计算),而α是学习速度。 因此,目标函数的梯度表示参数空间中优化步骤的方向,学习速度为其大小。 当使用不合理的高学习速度时,由于步长太大,可能会导致最佳点不断滑动。 另一方面,如果学习速度太低,那么优化将花费太多时间,并且只能确保收敛到低质量的局部最小值,而不是全局极值。 因此,在每种特定情况下,都必须寻求适当的折衷方案。 使用Adam算法的默认设置是入门的良好起点。
但是,在此任务中,默认的Adam设置显示较差的结果。 我们需要将初始学习率降低到0.0001。 否则,培训将无法确保融合。
最终,我们可以开始学习100多个时代,然后保存模型本身和学习历史。
%time命令是一个Ipython * magic命令,它允许您测量代码执行时间。

等级

让我们在训练期间评估模型的有效性。 在我们的案例中,验证准确性为73%(使用基本模型则为55%)。 该结果比基本模型的结果好得多。
我们还使用不准确度矩阵查看错误分布。 错误在类别之间几乎均匀地分布,对错误分类的负面示例(不准确度矩阵的左上单元)略有偏见。 这可以用正类别
的数据集很小的失衡来解释。
我们跟踪的另一个度量标准是接收器性能曲线(ROC曲线)和该曲线下方的面积(AUC)。 有关这些指标的详细说明,请参阅文章
用于识别图像中的情绪的基本模型 。

ROC曲线越靠近曲线图的左上点,并且其下的面积(AUC度量)越大,分类器的效果就越好。 该图清楚地表明,与从头开始创建的基础模型相比,经过改进和预训练的模型显示出更好的结果。 预训练模型的AUC值为0.82,这是一个很好的结果。

结论
在本文中,我们遇到了一种强大的技术-归纳学习。 我们还使用基于VGG架构的预训练特征提取单元构造了卷积神经网络分类器。 该分类器的性能特征超越了从头开始训练的基本卷积模型。 精度提高了18%,AUC度量值提高了0.25,这表明系统质量有了非常显着的提高。