我正在处理多个文件,并且每个文件中都有多个训练样本。我将按照此处所述使用ConcatDataset
:
除了真实样本外,我还需要其他样本,而且我需要从所有训练数据文件中随机选择阴性样本。因此,我想知道,返回的批样本是来自单个文件的随机连续卡盘,还是跨所有数据文件中的多个随机索引的批处理?
如果需要更多有关我要确切执行的操作的详细信息,这是因为我正在尝试使用Pytorch XLA进行TPU培训。
通常对于阴性样品,我只会使用第二个DataSet
和DataLoader
,但是,我正在尝试使用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
,它将需要处理真实样本和需要从我所有文件中随机选择的阴性样本。
答案 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中实现了多个采样器,例如RandomSampler
,SequentialSampler
,SubsetRandomSampler
,WeightedRandomSampler
。在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
函数中为每个正面样本选择负面样本。