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

Posted

技术标签:

【中文标题】如何解决由于 PyTorch 中大小不匹配导致的运行时错误?【英文标题】:How to resolve runtime error due to size mismatch in PyTorch? 【发布时间】: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 【参考方案1】:

只要你有:

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]

【讨论】:

如何计算b的值?似乎 c 的值由ChannelIn 乘以ChannelOut 确定 根据自己的经验,我想补充一点:如果无法通过合理的计算(例如图像高度 * 图像宽度 * 过滤器数量)来解释 b,则很可能图片的输入尺寸与假设不同。例如。我以为输入昏暗是 32x32 但它是 28x28。模型一直编译到密集层,但 b 是一个奇怪的数字。【参考方案2】:

如果您的输入是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)

【讨论】:

【参考方案3】:

你的错误:

尺寸不匹配,m1:[76800 x 256],m2:[784 x 128]

表示上一层输出形状不等于下一层输入形状

[76800 x 256], m2: [784 x 128] # Incorrect!
[76800 x 256], m2: [256 x 128] # Correct!

【讨论】:

以上是关于如何解决由于 PyTorch 中大小不匹配导致的运行时错误?的主要内容,如果未能解决你的问题,请参考以下文章

由于 UNION 导致的视图和表列大小不匹配

大小不匹配,m1:[3584 x 28],m2:[784 x 128] 在 /pytorch/aten/src/TH/generic/THTensorMath.cpp:940

PyTorch 中 fc.bias 和 fc.weight 的大小不匹配

在将TensorFlow模型转换为Pytorch时出现大小不匹配的错误。

pytorch nllloss 函数目标形状不匹配

由于SSH配置文件的不匹配,导致的Permission denied (publickey)及其解决方法