我正试图将最后一个卷积层的输出传递到FCC层,但我正在与维度作斗争。默认情况下,网络使用AdaptiveAvgPool2d(output_size=(6,6))什么不让我使用torch.use_deterministic_algorithms(True)为了再现性的目的。这是我得到的错误:
*mat1 dim 1 must match mat2 dim 0*
(10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(11): ReLU(inplace=True)
(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(avgpool): AdaptiveAvgPool2d(output_size=(6, 6))
(classifier): Sequential(
(0): Dropout(p=0.5, inplace=False)
(1): Linear(in_features=9216, out_features=4096, bias=True)
输入张量为:[10,3,350, 350].最后一个Conv2d/MaxPool2d层张量的形状为:torch。Size([10,256,9,9]). 我假设FCC的输入数应该是256 x 9 x 9 = 20736,但它不能很好地工作。
这也是我的类转发输出从CONV到FCC层:
class Identity(nn.Module):
def __init__(self):
super(Identity, self).__init__()
def forward(self, x):
print('SHAPE', np.shape(x))
return x
这个想法来自一个视频:https://www.youtube.com/watch?v=qaDe0qQZ5AQ&t=301s。提前谢谢你。
;你的完全连接层中的神经元数量没问题,但你的形状就不行。
-
在你的CNN和分类器之间的
nn.AdaptativeAveragePool2d
层将输出一个形状为(10, 256, 6, 6)
的张量。因为你已经用output_size
或(6, 6)
初始化了它。也就是说,第一个完全连接的层应该有256*6*6
神经元。self.fc = nn.Linear(in_features=9216, out_features=4096)
这符合您当前模型的设置,而不是您建议的20736
…
-
你的分类器输入形状应该是平坦的,这可以通过定义一个平坦层
nn.Flatten
来完成(或使用内联替代)。首先在初始化器中定义你的层:self.flatten = nn.Flatten()
然后
>>> x.shape # nn.AdaptativeAveragePool2d output torch.Size([10, 256, 6, 6]) >>> self.flatten(x) torch.Size([10, 9216])