在单个批次中对数据集中的每个图像进行 N 次采样
Sample each image from dataset N times in single batch
我目前正在从事学习表示(深度嵌入)的任务。我使用的数据集每个对象只有一个示例图像。我也用增强。
在训练期间,每个批次必须包含数据集中单个图像的 N 个不同增强版本(dataset[index]
总是 returns 新的随机变换)。
为此目的,是否有一些标准的解决方案或库与 DataLoader 一起使用 torch.utils.data.distributed.DistributedSampler
?
如果不是,从 torch.utils.data.DataLoader
(并调用 super().__init__(...)
)继承的任何 DataLoader 都可以在分布式训练中工作吗?
据我所知,这不是一种标准的做事方式——即使每个对象只有一个样本,每个批次仍然会从不同的对象中采样不同的图像,并且在不同的时期采样图像会有不同的变换。
也就是说,如果你真的想做你正在做的事情,为什么不简单地为你的数据集写一个包装器呢?
class Wrapper(Dataset):
N = 16
def __getitem__(self, index):
sample = [ super().__getitem__(index) for _ in N ]
sample = torch.stack(sample, dim=0)
return sample
然后您的每个批次都将是 BxNxCxHxW
,其中 B 是批次大小,N 是您的重复。从数据加载器获取批次后,您可以重塑批次。
我目前正在从事学习表示(深度嵌入)的任务。我使用的数据集每个对象只有一个示例图像。我也用增强。
在训练期间,每个批次必须包含数据集中单个图像的 N 个不同增强版本(dataset[index]
总是 returns 新的随机变换)。
为此目的,是否有一些标准的解决方案或库与 DataLoader 一起使用 torch.utils.data.distributed.DistributedSampler
?
如果不是,从 torch.utils.data.DataLoader
(并调用 super().__init__(...)
)继承的任何 DataLoader 都可以在分布式训练中工作吗?
据我所知,这不是一种标准的做事方式——即使每个对象只有一个样本,每个批次仍然会从不同的对象中采样不同的图像,并且在不同的时期采样图像会有不同的变换。
也就是说,如果你真的想做你正在做的事情,为什么不简单地为你的数据集写一个包装器呢?
class Wrapper(Dataset):
N = 16
def __getitem__(self, index):
sample = [ super().__getitem__(index) for _ in N ]
sample = torch.stack(sample, dim=0)
return sample
然后您的每个批次都将是 BxNxCxHxW
,其中 B 是批次大小,N 是您的重复。从数据加载器获取批次后,您可以重塑批次。