修改Resnet18时出错:RuntimeError:张量a(16)的大小必须匹配张量b(8)在非单维3的大小



我使用pytorch提供的Resnet18来做我的作业。输入的图像大小是3x64x64,分为100个类,所以老师让我们修改stride和padding,使最后的feature map大小为8x8x512。我改变了maxpooling层的stride,第三个conv块的第一个conv层和完全连接的层,如下所示:

model = models.resnet18(pretrained=True)
model.maxpool = MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
model.layer3[0].conv1 = conv.Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
model.fc = nn.Linear(model.fc.in_features, 100)

期望的特征映射大小是这样的:https://i.stack.imgur.com/2AfhS.png

当我使用火炬总结。摘要查看特征图大小查看是否正确,我遇到了错误:

RuntimeError: The size of tensor a (16) must match the size of tensor b (8) at non-singleton dimension 3

原因是什么?我认为stride, padding和channels设置正确。

我自己找到了原因。问题是关于"out=out+identity"部分。我改变了conv block 3的conv layer的stride,但是我没有改变downsampling block的conv layer的stride,所以downsampling和conv block 3的conv layer的feature map大小会不一样。这是一个非常微妙的问题,但它仍然花费了我很多时间。我只希望没有人像我一样被困在这里很长一段时间。

最新更新