Autoencoder 如何简化Pytorch中自动编码器的数据加载程序

Autoencoder 如何简化Pytorch中自动编码器的数据加载程序,autoencoder,pytorch,Autoencoder,Pytorch,有没有更简单的方法来设置数据加载器,因为在自动编码器的情况下,输入数据和目标数据是相同的,并且在训练期间加载数据?始终需要两个输入 目前,我对数据加载器的定义如下: 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_tra

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

目前,我对数据加载器的定义如下:

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)
然后像这样训练:

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)

我相信这很简单。除此之外,我想您必须实现自己的数据集。下面是一个示例代码

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())
按照以下步骤测试第一批产品

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())
最后,您可以在批处理训练循环中枚举加载的数据,如下所示

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())
玩得开心


另外,我共享的代码示例不会加载验证数据

为什么不将TensorDataset子类化,使其与未标记的数据兼容

类未标记的TensorDataset(TensorDataset):
“”“数据集包装未标记的数据张量。”。
每个样本都将通过沿第一个方向索引张量来检索
维
论据:
数据张量(tensor):包含示例数据。
"""
定义初始(自、数据张量):
self.data\u张量=data\u张量
定义uu获取项目uu(自身,索引):
返回自数据张量[索引]
和一些沿着这些路线训练你的自动编码器

X_列=rnd.随机((300100))
列车=未标记的张力或数据集(火炬从(X列车)浮起()
火车装载机=数据装载机。数据装载机(火车,批量大小=1)
对于范围(50)内的历元:
对于批量入列装载机:
数据=变量(批次)
optimizer.zero_grad()
输出=模型(数据)
损失=标准(输出、数据)