2017-07-14 9 views
2

オートローダーの場合、入力データとターゲットデータが同じで、トレーニング中にデータを読み込むため、データローダーを簡単に設定できますか? DataLoaderには常に2つの入力が必要です。Pytorchのオートローダー用の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) 

答えて

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) 
1

私は、これはそれを取得ほど単純であると考えています。それ以外の場合は、独自のデータセットを実装する必要があります。サンプルコードは以下の通りです。

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) 

第1バッチをテストするには、次のようにします。

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。私が共有したコードサンプルは検証データを読み込まない。

関連する問題