我对在PyTorch中执行的数据增强感到有点困惑。现在,据我所知,当我们执行数据增强时,我们保留原始数据集,然后添加其他版本的数据集(翻转,Cropping...etc)。但这似乎不像发生在PyTorch。据我从参考资料中了解到,当我们在data.transforms中使用PyTorch时,它会逐一应用它们。例如:
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])
]),
}在这里,为了训练,我们首先随机剪切图像并调整大小以形成(224,224)。然后我们拍摄这些(224,224)图像并水平翻转它们。因此,我们的数据集现在只包含水平翻转的图像,因此我们的原始图像在这种情况下丢失了。
我说的对吗?这种理解是正确的吗?如果没有,那么我们在上面的代码中告诉PyTorch (从官方文档中摘录)以保留原始图像并将它们调整为预期的形状(224,224)。
谢谢
发布于 2018-08-03 18:19:53
transforms操作在每次批处理生成时都应用于原始映像。因此,数据集将保持不变,只有批处理图像在每次迭代时都被复制和转换。
混淆可能来自这样一个事实,就像在您的示例中一样,transforms通常用于数据准备(调整大小/裁剪到预期尺寸、规范化值等)。以及数据增强(随机调整大小/裁剪,随机翻转图像等)。
您的data_transforms['train']所做的是:
(224, 224)修补程序TensorTensor规范化您的data_transforms['val']所做的是:
(256, 256)(224, 224)修补程序TensorTensor规范化(即将训练数据的随机调整大小/剪切替换为验证数据的固定操作,以获得可靠的验证结果)
如果你不希望你的训练图像水平翻转50/50的机会,只需删除transforms.RandomHorizontalFlip()行。
类似地,如果您希望您的图像始终以中心方式裁剪,请将transforms.RandomResizedCrop替换为transforms.Resize和transforms.CenterCrop,就像对data_transforms['val']那样。
发布于 2019-01-31 12:07:57
我假设您是在问这些数据增强转换(例如RandomHorizontalFlip)是否实际上也增加了dataset的大小,或者是一个接一个地应用于数据集中的每个项,而不是添加到dataset的大小。
运行以下简单的代码片段,我们可以看到是真,也就是说,如果您有一个包含8个图像的数据集,并且在遍历数据集时为该数据集创建一个PyTorch dataset对象,则在每个数据点上调用转换,并返回转换后的数据点。因此,例如,如果有随机翻转,一些数据点作为原始数据返回,一些数据点作为翻转返回(例如4个翻转和4个原始数据)。换句话说,通过对dataset项进行一次迭代,您就可以得到8个数据点(有些翻转了,有些没有)。这与增强数据集的传统理解不一致(例如,在这种情况下,增强数据集中有16个数据点)。
class experimental_dataset(Dataset):
def __init__(self, data, transform):
self.data = data
self.transform = transform
def __len__(self):
return len(self.data.shape[0])
def __getitem__(self, idx):
item = self.data[idx]
item = self.transform(item)
return item
transform = transforms.Compose([
transforms.ToPILImage(),
transforms.RandomHorizontalFlip(),
transforms.ToTensor()
])
x = torch.rand(8, 1, 2, 2)
print(x)
dataset = experimental_dataset(x,transform)
for item in dataset:
print(item)结果:(浮点数的细微差异是由于将浮点数转换为pil图像和背面)。
原始虚拟数据集:
tensor([[[[0.1872, 0.5518],
[0.5733, 0.6593]]],
[[[0.6570, 0.6487],
[0.4415, 0.5883]]],
[[[0.5682, 0.3294],
[0.9346, 0.1243]]],
[[[0.1829, 0.5607],
[0.3661, 0.6277]]],
[[[0.1201, 0.1574],
[0.4224, 0.6146]]],
[[[0.9301, 0.3369],
[0.9210, 0.9616]]],
[[[0.8567, 0.2297],
[0.1789, 0.8954]]],
[[[0.0068, 0.8932],
[0.9971, 0.3548]]]])转换数据集:
tensor([[[0.1843, 0.5490],
[0.5725, 0.6588]]])
tensor([[[0.6549, 0.6471],
[0.4392, 0.5882]]])
tensor([[[0.5647, 0.3255],
[0.9333, 0.1216]]])
tensor([[[0.5569, 0.1804],
[0.6275, 0.3647]]])
tensor([[[0.1569, 0.1176],
[0.6118, 0.4196]]])
tensor([[[0.9294, 0.3333],
[0.9176, 0.9608]]])
tensor([[[0.8549, 0.2275],
[0.1765, 0.8941]]])
tensor([[[0.8902, 0.0039],
[0.3529, 0.9961]]])发布于 2020-09-11 18:20:38
是的,数据集大小在转换后不会更改。每个图像都被传递给转换并返回,因此大小保持不变。
如果希望使用具有转换后的数据集的原始数据集,请将它们连接起来。
例如increased_dataset = torch.utils.data.ConcatDataset([transformed_dataset,original])
https://stackoverflow.com/questions/51677788
复制相似问题