如何解决由于 PyTorch 中的大小不匹配导致的运行时错误?

新手上路,请多包涵

我正在尝试使用 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))

原文由 Shreyas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 871
2 个回答

If your input is 3 x 256 x 256 , then you need to convert it to B x N to pass it through the linear layer: nn.Linear(3*256*256, 128) where B is batch_sizeN 是线性层输入大小。如果您一次给出一张图像,您可以将形状为 3 x 256 x 256 的输入张量转换为 1 x (3*256*256) ,如下所示。

 img = img.view(1, -1) # converts [3 x 256 x 256] to 1 x 196608
output = model(img)

原文由 Wasi Ahmad 发布,翻译遵循 CC BY-SA 3.0 许可协议

每当你有:

 RuntimeError: size mismatch, m1: [a x b], m2: [c x d]

您只需要关心 b=c 就完成了:

m1[a x b][batch size x in features]

m2[c x d][in features x out features]

原文由 prosti 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题