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



在我读到的很多关于卷积神经网络(CNN)的研究论文中,我看到人们从图像中随机截取一个方形区域(例如224x224),然后随机地将其水平翻转。为什么要随机裁剪和翻转呢?还有,为什么人们总是在一个方形的区域里种植农作物。cnn不能在矩形区域上工作吗?

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

翻转图像背后的直觉是,对象应该与其镜像具有同等的可识别性。注意水平翻转是常用的翻转方式。垂直翻转并不总是有意义的,但这取决于数据。

裁剪背后的思想是为了减少背景对cnn决策的贡献。如果你有标签来定位对象的位置,这是很有用的。这让你可以使用周围区域作为负面例子,并建立一个更好的检测器。随机裁剪也可以作为一个正则化器,并基于对象的部分存在来进行分类,而不是将所有内容都集中在可能并不总是存在的非常明显的特征上。

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

这不是cnn的限制。它可能是特定实现的限制。或者通过设计,因为假设一个方形输入可以优化实现速度。我不会对此做过多解读。

可变输入与固定输入的cnn:

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

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

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

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

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

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

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

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

是的,只要你可以为完全连接的图层生成固定大小的输入,输入图像的大小并不重要。一个好的选择是自适应池化,它将从可变大小的输入特征映射生成固定的输出特征映射。现在,PyTorch为图像提供了两个自适应池化层,即AdaptiveMaxPool2d和adaptivavgpool2d。你可以使用层来构建一个神经网络,它可以接受可变大小的输入图像。

最新更新