Как упростить DataLoader для автоэнкодера в 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)

person N8_Coder    schedule 14.07.2017    source источник


Ответы (2)


Почему бы не создать подкласс 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)
person x0s    schedule 09.01.2018

Я считаю, что это очень просто. Помимо этого, я думаю, вам придется реализовать свой собственный набор данных. Ниже приведен пример кода.

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. Образцы кода, которыми я поделился, не загружают данные проверки.

person Mo Hossny    schedule 14.07.2017