【发布时间】:2018-09-11 09:17:46
【问题描述】:
我正在尝试使用PyTorch 实现一个简单的自动编码器。我的数据集由 256 x 256 x 3 图像组成。我已经构建了一个 torch.utils.data.dataloader.DataLoader 对象,该对象将图像存储为张量。当我运行自动编码器时,出现运行时错误:
尺寸不匹配,m1:[76800 x 256],m2:[784 x 128] /Users/soumith/minicondabuild3/conda-bld/pytorch_1518371252923/work/torch/lib/TH/generic/THTensorMath.c:1434
这些是我的超参数:
batch_size=100,
learning_rate = 1e-3,
num_epochs = 100
以下是我的自动编码器的架构:
class autoencoder(nn.Module):
def __init__(self):
super(autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(3*256*256, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(True),
nn.Linear(64, 12),
nn.ReLU(True),
nn.Linear(12, 3))
self.decoder = nn.Sequential(
nn.Linear(3, 12),
nn.ReLU(True),
nn.Linear(12, 64),
nn.ReLU(True),
nn.Linear(64, 128),
nn.Linear(128, 3*256*256),
nn.ReLU())
def forward(self, x):
x = self.encoder(x)
#x = self.decoder(x)
return x
这是我用来运行模型的代码:
for epoch in range(num_epochs):
for data in dataloader:
img = data['image']
img = Variable(img)
# ===================forward=====================
output = model(img)
loss = criterion(output, img)
# ===================backward====================
optimizer.zero_grad()
loss.backward()
optimizer.step()
# ===================log========================
print('epoch [{}/{}], loss:{:.4f}'
.format(epoch+1, num_epochs, loss.data[0]))
if epoch % 10 == 0:
pic = show_img(output.cpu().data)
save_image(pic, './dc_img/image_{}.jpg'.format(epoch))
【问题讨论】:
-
您在哪一行得到错误?
x你传递给 forward 函数的形状是什么?编码器中的第一个线性层:nn.Linear(3*256*256, 128)正确吗? -
我在运行 output =model(input) 时遇到错误。据我所知,线性层将图像展平并执行类似于“Y=Ax+B”的操作。由于我的输入是 256X256X3 图像,因此元素的总数将是它的乘积。
-
我添加了用于训练模型的代码。
-
“据我所知,线性层会使图像变平”。你测试过这个假设吗?因为,这似乎不是真的。
-
PyTorch 文档是这么说的。或者至少是我从中推断出来的。pytorch.org/docs/master/nn.html#linear-layers
标签: python pytorch autoencoder