PyTorch DataLoader:每次调用时都遍历数据的子集而不是整个数据

时间:2021-06-16 14:21:37

标签: python pytorch

假设我有一个火炬 dataloader = DataLoader(...) 对象。每当我在函数中调用 for data, label in dataloader: 时,我都不想遍历整个数据集,所以目前我使用:

dataloader = DataLoader(...)
iter_dataloader = iter(dataloader)
batch = iter_dataloader.next()  # Set the first batch

def train_batch():
   data, label = batch
   prediction = model(data)
   # Do fancy things here
   try: 
      batch = iter_dataloader.next()  # Load the next batch
   except:
      iter_dataloader = iter(dataloader)  # if the iterator object reaches the end, reset the dataloader
      batch = iter_dataloader.next()  

for _ in range(N):
   train_batch()  # This function is called multiple times

对于 train_batch() 的每次调用,我从数据集中获取一批,训练模型,然后加载下一批。如果没有剩余批次,我会重置 DataLoader 对象。

现在我的问题:

  1. 有没有办法让代码更简洁?也就是说,我不想使用 iternext 方法。每次我调用它时,它都会自动从中采样一批,并在到达末尾时自动重置。我听说过 Sampler,但我没有使用过。
  2. 上述扩展:我可以使用我正在使用的数据集大小的 K 批或 1/K 来代替批处理吗?
  3. 我想要三种采样方法:(1)按顺序从中采样批次(无混洗),(2)从它随机采样(有和没有替换 - 混洗),以及(3)从中采样,使得标签是平等的。有没有办法做到这一点?

0 个答案:

没有答案