在很多关于卷积神经网络(CNN)的研究论文中,我看到人们从图像中随机裁剪一个方形区域(例如224x224),然后随机地水平翻转它。为什么这种随机裁剪和翻转完成了?此外,为什么人们总是裁剪一个方形区域。 CNN不能在矩形区域上工作吗?
答案 0 :(得分:23)
这称为数据扩充。通过将转换应用于训练数据,您可以添加合成数据点。这使模型暴露于其他变体,而无需收集和注释更多数据。这可以减少过度拟合并提高模型的推广能力。
翻转图像背后的直觉是,对象应该与其镜像图像一样可识别。请注意,水平翻转是经常使用的翻转类型。垂直翻转并不总是有意义,但这取决于数据。
裁剪背后的想法是减少背景在CNN决策中的贡献。如果您有用于定位对象所在位置的标签,那么这非常有用。这使您可以使用周围区域作为反面示例并构建更好的检测器。随机裁剪也可以作为一个正则化器,并根据对象部分的存在进行分类,而不是将所有内容都集中在一个可能并不总是存在的非常独特的特征上。
为什么人们总是裁剪一个方形区域?
这不是CNN的限制。它可能是特定实现的限制。或者通过设计,因为假设方形输入可以导致优化速度的实现。我不会读太多内容。
CNN具有可变大小的输入与固定输入:
这不是特定于裁剪到正方形,而是更普遍的原因为什么输入有时会在输入到CNN之前调整大小/裁剪/扭曲:
需要记住的是,设计CNN涉及决定是否支持可变大小的输入。卷积运算,汇集和非线性将适用于任何输入维度。但是,当使用CNN解决图像分类时,通常最终会得到一个完全连接的层,例如逻辑回归或MLP。完全连接的层是CNN如何产生固定大小的输出向量。固定大小的输出可以将CNN限制为固定大小的输入。
确实有一些解决方法可以允许可变大小的输入,并且仍然可以生成固定大小的输出。最简单的方法是使用卷积层对图像中的常规补丁进行分类。这个想法已经存在了一段时间。其背后的意图是检测图像中多次出现的对象并对每次出现进行分类。我能想到的最早的例子是20世纪90年代Yann LeCun小组的工作simultaneously classify and localize digits in a string。 这被称为将具有完全连接层的CNN转变为完全卷积网络。 Most recent examples of fully-convolutional networks用于解决语义分割并对图像中的每个像素进行分类。这里需要产生一个与输入尺寸相匹配的输出。 另一种解决方案是在CNN的末尾使用全局池来将可变大小的特征映射转换为固定大小的输出。池化窗口的大小设置为等于从最后一个conv计算的特征映射。层
答案 1 :(得分:2)
@ypx已经就为什么需要数据增强提供了一个很好的答案。我将分享有关人们为何使用固定大小的方形图像作为输入的更多信息。
如果您对卷积神经网络有基本了解,那么对于卷积,汇集图层和非线性图层,您会知道输入图像的大小可变。但是神经网络通常具有完全连接的层作为分类器,最后的转换层和第一个完全连接的层之间的权重是固定的。如果给出网络可变大小的输入图像,则会出现问题,因为要素图大小和权重不匹配。这是使用固定大小输入图像的一个原因。
另一个原因是通过固定图像尺寸,可以减少神经网络的训练时间。这是因为大多数(如果不是全部)深度学习包被编写为以张量格式处理一批图像(通常是形状(N,C,H,W),N是批量大小,C是通道号,H和W是图像的宽度和高度)。如果输入图像没有固定大小,则无法将它们打包成批处理。即使您的网络可以处理可变大小的输入图像,您仍然必须一次输入1个图像。与批处理相比,这个速度较慢。
是的,只要您可以为完全连接的图层生成固定大小的输入,输入图像大小就无关紧要了。一个很好的选择是自适应池,它将从可变大小的输入要素图产生固定的输出要素图。现在,PyTorch为图像提供了两个自适应池化层,即AdaptiveMaxPool2d和AdaptiveAvgPool2d。您可以使用图层构建一个可以接受可变大小输入图像的神经网络。