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

13

我正在尝试使用 PyTorch 实现一个简单的自编码器。我的数据集由 256 x 256 x 3 的图像组成。我已经构建了一个 torch.utils.data.dataloader.DataLoader 对象,其中包含图像存储为张量。当我运行自编码器时,出现了运行时错误:

size mismatch, m1: [76800 x 256], m2: [784 x 128] at /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))

1
你在哪一行代码中遇到了错误?你传递给前向函数的 x 的形状是什么?编码器中的第一个线性层 nn.Linear(3*256*256, 128) 是否正确? - Wasi Ahmad
当我运行output = model(input)时,出现错误。据我所知,线性层会使图像变成平面并执行类似于“Y= Ax+B”的操作。由于我的输入是256X256X3图像,因此元素的总数将是它们的乘积。 - Shreyas
我已经添加了用于训练模型的代码。 - Shreyas
根据我的了解,线性层会将图像展平。您是否测试过这个假设?因为看起来并不正确。 - MaxPowers
PyTorch文档是这么说的。或者至少这是我从中推断出来的。http://pytorch.org/docs/master/nn.html#linear-layers - Shreyas
3个回答

33

无论何时你遇到以下情况:

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

你需要关心的只有 b=c,然后就完成了:

m1[a x b],其中 a 是批量大小,b 是输入特征数。

m2[c x d],其中 c 是输入特征数,d 是输出特征数。


你如何计算变量b的值?似乎变量c的值由ChannelInChannelOut相乘得出。 - KoKo
从我自己的经验来看,我想补充一点:如果一个人无法通过合理的计算(例如图像高度图像宽度过滤器数量)来解释b,那么很可能图片的输入维度与假设不同。例如,我原以为输入维度是32x32,但实际上是28x28。模型编译到密集层时b的值变得怪异了。 - very_interesting

13
如果你的输入是3 x 256 x 256,那么你需要将其转换为B x N以通过线性层:nn.Linear(3*256*256, 128),其中Bbatch_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)

1
你的错误:

大小不匹配,m1: [76800 x 256],m2: [784 x 128]

表明前一层输出形状与下一层输入形状不相等
[76800 x 256], m2: [784 x 128] # Incorrect!
[76800 x 256], m2: [256 x 128] # Correct!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接