卷积神经网络中的随机裁剪和翻转

Random cropping and flipping in convolutional neural networks

在我读到的很多关于卷积神经网络 (CNN) 的研究论文中,我看到人们从图像中随机裁剪一个正方形区域(例如 224x224),然后随机水平翻转它。为什么要进行这种随机裁剪和翻转?另外,为什么人们总是裁剪一个方形区域。 CNN 不能处理矩形区域吗?

这称为数据扩充。通过对训练数据应用转换,您可以添加合成数据点。这使模型暴露于其他变化,而无需收集和注释更多数据的成本。这样可以起到减少过拟合,提高模型泛化能力的效果。

翻转图像背后的直觉是,一个对象应该与其镜像一样具有可识别性。请注意,水平翻转是经常使用的翻转类型。垂直翻转并不总是有意义,但这取决于数据。

cropping 背后的想法是减少背景对 CNN 决策的影响。如果您有用于定位对象所在位置的标签,这将很有用。这使您可以将周围区域用作反例并构建更好的检测器。随机裁剪也可以充当正则化器,并根据对象的某些部分的存在进行分类,而不是将所有内容都集中在可能并不总是存在的非常独特的特征上。

Why do people always crop a square region?

这不是 CNN 的限制。它可能是特定实现的限制。或者是设计使然,因为假设方形输入可以导致优化实现速度。我不会对此读太多。

具有可变大小输入与固定输入的 CNN:

这并不特定于裁剪为正方形,但更一般地说,为什么在输入 CNN 之前输入有时 resized/cropped/warped:

需要记住的一点是,设计 CNN 涉及决定是否支持可变大小的输入。卷积运算、池化和非线性将适用于任何输入维度。然而,当使用 CNN 解决图像分类问题时,您通常会得到一个全连接层,例如逻辑回归或 MLP。全连接层是 CNN 如何生成固定大小的输出向量的方式。固定大小的输出可以将 CNN 限制为固定大小的输入。

肯定有变通方法可以允许可变大小的输入并仍然产生固定大小的输出。最简单的是使用卷积层对图像中的规则块进行分类。这个想法已经存在了一段时间。其背后的意图是检测图像中多次出现的对象并对每次出现的对象进行分类。我能想到的最早的例子是Yann LeCun的小组在1990年代到simultaneously classify and localize digits in a string的工作。 这被称为将具有完全连接层的 CNN 转变为完全卷积网络。 Most recent examples of fully-convolutional networks 用于解决语义分割并对图像中的每个像素进行分类。这里需要产生与输入维度相匹配的输出。 另一种解决方案是在 CNN 末尾使用全局池化将可变大小的特征图转换为固定大小的输出。池的大小 window 设置为等于从最后一个卷积计算的特征图。层.

@ypx 已经很好地回答了为什么需要数据增强。我将分享更多关于为什么人们使用固定大小的方形图像作为输入的信息。

为什么要固定尺寸输入图像?

如果你有卷积神经网络的基础知识,你就会知道对于卷积层、池化层和非线性层来说,输入图像大小可变就可以了。但是神经网络通常有全连接层作为分类器,最后一个卷积层和第一个全连接层之间的权重是固定的。如果给网络可变大小的输入图像,就会出现问题,因为特征图大小和权重不匹配。这是使用固定尺寸输入图像的原因之一。

另一个原因是通过固定图像大小,可以减少神经网络的训练时间。这是因为大多数(如果不是全部)深度学习包都是用来处理张量格式的一批图像(通常形状为 (N, C, H, W),N 是批量大小,C 是通道号,H 和W 是图像的宽度和高度)。如果您的输入图像没有固定大小,则不能将它们打包成一个批次。即使您的网络可以处理可变大小的输入图像,您仍然必须一次输入 1 张图像。这比批处理要慢。

我们可以使用可变大小的输入图像吗?

是的,只要您可以为全连接层生成固定大小的输入,输入图像大小并不重要。一个不错的选择是自适应池化,它将从可变大小的输入特征图产生固定的输出特征图。目前,PyTorch 为图像提供了两个自适应池化层,即 AdaptiveMaxPool2d and AdaptiveAvgPool2d。您可以使用图层构建一个可以接受可变大小输入图像的神经网络。