17

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

4

2 回答 2

31

这称为数据增强。通过对训练数据应用转换,您将添加合成数据点。这使模型暴露在额外的变化中,而无需收集和注释更多数据。这可以起到减少过拟合和提高模型泛化能力的作用。

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

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

为什么人们总是裁剪正方形区域?

这不是 CNN 的限制。这可能是特定实现的限制。或者通过设计,因为假设一个正方形输入可以导致优化速度的实现。我不会读太多。

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

这不是特定于裁剪为正方形,而是更一般地说,为什么输入有时会在输入到 CNN 之前调整大小/裁剪/扭曲:

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

肯定有一些解决方法可以允许可变大小的输入并仍然产生固定大小的输出。最简单的是使用卷积层对图像中的常规块进行分类。这个想法已经存在了一段时间。其背后的目的是检测图像中多次出现的对象并对每次出现进行分类。我能想到的最早的例子是 Yann LeCun 小组在 1990 年代同时对字符串中的数字进行分类和定位的工作。这被称为将具有完全连接层的 CNN 转变为完全卷积网络。全卷积网络的最新示例用于解决语义分割并对图像中的每个像素进行分类。这里需要产生与输入尺寸相匹配的输出。另一种解决方案是在 CNN 末尾使用全局池化将可变大小的特征图转换为固定大小的输出。池化窗口的大小设置为等于从最后一个 conv 计算的特征图。层。

于 2015-09-29T12:40:35.820 回答
2

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

为什么要固定大小的输入图像?

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

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

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

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

于 2017-11-12T14:09:16.670 回答