【问题标题】:How to simplify DataLoader for Autoencoder in Pytorch如何在 Pytorch 中简化自动编码器的 DataLoader
【发布时间】:2017-12-19 08:28:53
【问题描述】:

有没有更简单的方法来设置数据加载器,因为在自动编码器的情况下输入和目标数据是相同的,并且在训练期间加载数据? DataLoader 始终需要两个输入。

目前我这样定义我的数据加载器:

X_train     = rnd.random((300,100))
X_val       = rnd.random((75,100))
train       = data_utils.TensorDataset(torch.from_numpy(X_train).float(), torch.from_numpy(X_train).float())
val         = data_utils.TensorDataset(torch.from_numpy(X_val).float(), torch.from_numpy(X_val).float())
train_loader= data_utils.DataLoader(train, batch_size=1)
val_loader  = data_utils.DataLoader(val, batch_size=1)

然后像这样训练:

for epoch in range(50):
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = Variable(data), Variable(target).detach()
        optimizer.zero_grad()
        output = model(data, x)
        loss = criterion(output, target)

【问题讨论】:

    标签: autoencoder pytorch


    【解决方案1】:

    为什么不继承 TensorDataset 以使其与未标记的数据兼容?

    class UnlabeledTensorDataset(TensorDataset):
        """Dataset wrapping unlabeled data tensors.
    
        Each sample will be retrieved by indexing tensors along the first
        dimension.
    
        Arguments:
            data_tensor (Tensor): contains sample data.
        """
        def __init__(self, data_tensor):
            self.data_tensor = data_tensor
    
        def __getitem__(self, index):
            return self.data_tensor[index]
    

    还有一些类似的东西来训练你的自动编码器

    X_train     = rnd.random((300,100))
    train       = UnlabeledTensorDataset(torch.from_numpy(X_train).float())
    train_loader= data_utils.DataLoader(train, batch_size=1)
    
    for epoch in range(50):
        for batch in train_loader:
            data = Variable(batch)
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, data)
    

    【讨论】:

      【解决方案2】:

      我相信这很简单。除此之外,我想您将不得不实现自己的数据集。示例代码如下。

      class ImageLoader(torch.utils.data.Dataset):
      def __init__(self, root, tform=None, imgloader=PIL.Image.open):
          super(ImageLoader, self).__init__()
      
          self.root=root
          self.filenames=sorted(glob(root))
          self.tform=tform
          self.imgloader=imgloader
      
      def __len__(self):
          return len(self.filenames)
      
      def __getitem__(self, i):
          out = self.imgloader(self.filenames[i])  # io.imread(self.filenames[i])
          if self.tform:
              out = self.tform(out)
          return out
      

      然后您可以按如下方式使用它。

      source_dataset=ImageLoader(root='/dldata/denoise_ae/clean/*.png', tform=source_depth_transform)
      target_dataset=ImageLoader(root='/dldata/denoise_ae/clean_cam_n9dmaps/*.png', tform=target_depth_transform)
      source_dataloader=torch.utils.data.DataLoader(source_dataset, batch_size=32, shuffle=False, drop_last=True, num_workers=15)
      target_dataloader=torch.utils.data.DataLoader(target_dataset, batch_size=32, shuffle=False, drop_last=True, num_workers=15)
      

      要测试第一批,如下所示。

      dataiter = iter(source_dataloader)
      images = dataiter.next()
      print(images.size())
      

      最后你可以在批量训练循环中枚举加载的数据,如下所示。

      for i, (source, target) in enumerate(zip(source_dataloader, target_dataloader), 0):
          source, target = Variable(source.float().cuda()), Variable(target.float().cuda())
      

      玩得开心。

      PS。我共享的代码示例不加载验证数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-08
        • 2019-12-10
        • 2019-12-07
        • 1970-01-01
        • 2019-10-18
        • 2020-03-09
        • 2021-07-09
        • 1970-01-01
        相关资源
        最近更新 更多