我正在尝试使用pytorch进行数据扩充。特别是,我有一个包含150张图像的数据集,我想对每个图像应用5个变换(水平翻转,3个随机旋转和垂直翻转),以包含750张图像,但是我的代码始终包含150张图像。
'train': transforms.Compose([
transforms.Resize(224),
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(degrees = (90,90)),
transforms.RandomRotation(degrees = (180,180)),
transforms.RandomRotation(degrees = (270,270)),
transforms.RandomVerticalFlip(p=1),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
答案 0 :(得分:0)
您误解了API。当您向数据集中添加一些转换时,它实际上是一个函数,该函数将应用于该数据集中的每个样本,然后返回。 transforms.Compose
按顺序应用子转换,而不是返回多个结果(每次转换是否应用)。所以
transforms.Compose([
transforms.RandomRotation(degrees = (90, -90)),
transforms.RandomRotation(degrees = (180, -180)),
])
只会以90度到90度之间的随机角度(即正好90度)旋转图像,然后再旋转180度。这等效于单个RandomRotation(degrees=(270, 270))
(实际上更糟因为它会导致更多的数据损坏过程。)
因此,大多数transforms
如上-“线性”-一个输入,一个输出。有些“分叉”转换产生的输出多于输入。一个示例是FiveCrop
。请注意其有关如何处理的说明。即使进行“分叉”转换,您在数据集中仍将获得相同数量的项目,只是批次会更大。
如果您特别希望有一个数据集,其中包含每个项目的4个不同轮换的副本并随机产生它们(即,每个轮换的变体可能以不同的批次出现),则必须编写一些自定义数据加载逻辑。为此,您可能希望将工作基于DatasetFolder
的来源。
为什么API会这样?实际上,大多数人都可以接受当前的变换-在您的位置,他们只需编写一个变换,即可随机翻转0、90、180或270度,然后训练网络的时间比您多4倍,平均每个样本取一个样本。