Pytorch-转移学习教程中图像预处理的目的

时间:2018-06-21 07:58:34

标签: image-processing dataset transformation pytorch

Pytorch transfer learning tutorial中,正在使用以下代码对训练集和测试集中的图像进行预处理:

data_transforms = {
'train': transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}

我的问题是-选择这种转换的直觉是什么?特别是,选择RandomResizedCrop(224)RandomHorizontalFlip()的直觉是什么?只让神经网络在整个图像上训练会更好吗? (或至少使用这些转换来扩充数据集)?我了解为什么只将包含蚂蚁/蜜蜂的图像部分插入神经网络是合理的,却无法理解为什么插入随机作物是合理的...

希望我设法弄清楚所有问题

谢谢!

1 个答案:

答案 0 :(得分:2)

关于RandomResizedCrop

  1. 为什么...ResizedCrop-这个答案很简单。将农作物调整为相同的尺寸可以批处理输入数据。由于玩具数据集中的训练图像具有不同的维度,因此这是提高训练效率的最佳方法。

  2. 为什么要Random...-每次迭代在每个图像上生成不同的随机裁剪(即,在调整大小之前生成随机中心和随机裁剪尺寸/比率)是一种人为增加您的效果的好方法数据集,即在每次迭代中为网络提供外观不同的输入(从相同的原始图像中提取)。这有助于部分避免对小型数据集的过度拟合,并使您的网络总体上更加健壮。

    您是正确的,因为某些训练图像的宽度最大为500px,并且语义目标(ant / bee)有时仅覆盖了图像的一小部分,这些随机农作物中的一些不会包含昆虫的机会...但是,只要发生这种情况的机会保持相对较低,就不会真正影响您的训练。每次迭代供给不同的训练作物的优势(而不是总是提供相同的非增强图像)极大地抵消了有时提供“空”作物的副作用。您可以通过在代码中将RandomResizedCrop(224)替换为Resize(224)(固定大小)来验证此断言,然后比较测试集的最终精度。

    此外,我要补充一点,神经网络是智能cookie,有时会学会通过您不期望的功能来识别图像(即,如果您的数据集或损失有偏见(例如,过度拟合),它们往往会学习识别捷径)。尽管这个玩具网络有时表现出色,尽管有时会学习“空”作物,但我不会感到惊讶。区分通常的“蚂蚁背景”(底层,树叶等)和“蜜蜂背景”(花)。

关于RandomHorizontalFlip

其目的还在于人为地扩充您的数据集。对于网络而言,图像及其翻转版本是两个不同的输入,因此您基本上是在人为地将训练数据集的大小加倍以实现“免费”。


还有很多操作可以用来扩充训练数据集(例如RandomAffineColorJitter等)。但是,必须谨慎选择对目标用例有意义的转换,且不会影响目标语义信息的转换(例如,对于蚂蚁/蜜蜂分类,RandomHorizontalFlip很好,因为您可能会获得尽可能多的图像面向右的昆虫比面向左的昆虫;但是RandomVerticalFlip并没有多大意义,因为您肯定不会完全颠倒地看到昆虫的照片。