从ConcatDataset创建的DataLoader是从其他文件还是单个文件创建批处理?

时间:2019-10-13 20:06:33

标签: pytorch

我正在处理多个文件,并且每个文件中都有多个训练样本。我将按照此处所述使用ConcatDataset

https://discuss.pytorch.org/t/dataloaders-multiple-files-and-multiple-rows-per-column-with-lazy-evaluation/11769/7

除了真实样本外,我还需要其他样本,而且我需要从所有训练数据文件中随机选择阴性样本。因此,我想知道,返回的批样本是来自单个文件的随机连续卡盘,还是跨所有数据文件中的多个随机索引的批处理?

如果需要更多有关我要确切执行的操作的详细信息,这是因为我正在尝试使用Pytorch XLA进行TPU培训。

通常对于阴性样品,我只会使用第二个DataSetDataLoader,但是,我正在尝试使用Pytorch XLA训练TPU(几天前才发布Alpha {{3 }}),为此,我需要将DataLoader发送到torch_xla.distributed.data_parallel.DataParallel对象,例如model_parallel(train_loop_fn, train_loader),在这些示例笔记本中可以看到

https://github.com/pytorch/xla

https://github.com/pytorch/xla/blob/master/contrib/colab/resnet18-training-xrt-1-15.ipynb

因此,我现在仅限于一个DataLoader,它将需要处理真实样本和需要从我所有文件中随机选择的阴性样本。

1 个答案:

答案 0 :(得分:3)

ConcatDataset是一个自定义类,它是torch.utils.data.Dataset的子类。让我们看一个例子。

class ConcatDataset(torch.utils.data.Dataset):
    def __init__(self, *datasets):
        self.datasets = datasets

    def __getitem__(self, i):
        return tuple(d[i] for d in self.datasets)

    def __len__(self):
        return min(len(d) for d in self.datasets)

train_loader = torch.utils.data.DataLoader(
             ConcatDataset(
                 dataset1, 
                 dataset2
             ),
             batch_size=args.batch_size, 
             shuffle=True,
             num_workers=args.workers, 
             pin_memory=True)

for i, (input, target) in enumerate(train_loader):
    ...

在这里,两个数据集,即dataset1(示例列表)和dataset2被合并形成一个训练数据集。 __getitem__函数从数据集中返回一个示例,BatchSampler将使用它来形成训练迷你批。

  

返回的批样本将是单个文件中的随机连续卡盘,还是将批处理跨所有数据文件中的多个随机索引?

由于您已将所有数据文件组合成一个数据集,所以现在取决于您使用BatchSampler来采样迷你批次了。在PyTorch中实现了多个采样器,例如RandomSamplerSequentialSamplerSubsetRandomSamplerWeightedRandomSampler。在documentation中查看其用法。

您也可以按照以下方式使用自定义BatchSampler

class MyBatchSampler(Sampler):
    def __init__(self, *params):
        # write your code here

    def __iter__(self):
        # write your code here
        # return an iterable

    def __len__(self):
        # return the size of the dataset

__iter__函数应返回可迭代的小批量。您可以在此功能中实现形成迷你批次的逻辑。

要随机抽取负面样本进行训练,一种替代方法是在__init__类的ConcatDataset函数中为每个正面样本选择负面样本。