【问题标题】:Is A PyTorch Dataset Accessed by Multiple DataLoader Workers?多个 DataLoader Worker 是否访问了 PyTorch 数据集?
【发布时间】:2020-10-03 06:25:34
【问题描述】:

在 PyTorch 中使用超过 1 个 DataLoader 工作者时,每个工作者都访问同一个 Dataset 实例吗?还是每个 DataLoader 工作者都有自己的 Dataset 实例?

from torch.utils.data import DataLoader, Dataset

class NumbersDataset(Dataset):
    def __init__(self):
        self.samples = list(range(1, 1001))

    def __len__(self):
        return len(self.samples)

    def __getitem__(self, idx):
        return self.samples[idx]

dataset = NumbersDataset()
train_loader = DataLoader(dataset, num_workers=4)

【问题讨论】:

    标签: python python-3.x deep-learning neural-network pytorch


    【解决方案1】:

    看起来他们正在访问同一个实例。我尝试在数据集类中添加一个静态变量,并在每次创建新实例时递增它。代码如下。

    from torch.utils.data import DataLoader, Dataset
    
    
    class NumbersDataset(Dataset):
        i = 0
    
        def __init__(self):
            NumbersDataset.i += 1
            self.samples = list(range(1, 1001))
    
        def __len__(self):
            return len(self.samples)
    
        def __getitem__(self, idx):
            return self.samples[idx]
    
    
    dataset_1 = NumbersDataset()
    train_loader = DataLoader(dataset_1, num_workers=4)
    
    for i, data in enumerate(train_loader):
        pass
    
    dataset_2 = NumbersDataset()
    train_loader = DataLoader(dataset_2, num_workers=4)
    
    for i, data in enumerate(train_loader):
        pass
    
    print(NumbersDataset.i)
    

    输出为 2。希望对您有所帮助:D

    【讨论】:

      【解决方案2】:

      我在试图弄清楚 Pytorch 的 DataLoader 是否正在生成 deepcopy 的数据集实例时偶然发现了这个很棒的线程。 @yilmazdoga 的答案不是正确的答案,但是通过稍微修改该代码,我们可以获得我们需要的结果:

      from torch.utils.data import DataLoader, Dataset
      
      
      class NumbersDataset(Dataset):
          id_set = set()
      
          def __init__(self):
              self.samples = list(range(1, 100))
      
          def __len__(self):
              NumbersDataset.id_set.add(id(self.samples))
              return len(self.samples)
      
          def __getitem__(self, idx):
              NumbersDataset.id_set.add(id(self.samples))
              return self.samples[idx]
      
      
      dataset = NumbersDataset()
      train_loader = DataLoader(dataset, num_workers=4)
      
      for i, data in enumerate(train_loader):
          pass
      
      print(NumbersDataset.id_set)
      

      发生了什么?我们正在存储self.samples 对象的id。如果DataLoader 正在制作深拷贝,那么样本的id 应该是不同的,所以我们将有NumbersDataset.id_set 包含4 个元素。但实际上,它只包含 1 个元素,因此每个工作人员只有一个数据集的软拷贝(这是合乎逻辑的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-27
        • 2018-12-22
        • 2021-06-01
        • 2020-05-22
        • 2022-01-18
        • 2020-07-05
        • 2019-09-19
        • 2021-10-23
        相关资源
        最近更新 更多