将最后一个卷积层的输出传递到FCC层- PyTorch



我正试图将最后一个卷积层的输出传递到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。提前谢谢你。

;你的完全连接层中的神经元数量没问题,但你的形状就不行。

  1. 在你的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

  1. 你的分类器输入形状应该是平坦的,这可以通过定义一个平坦层nn.Flatten来完成(或使用内联替代)。首先在初始化器中定义你的层:

    self.flatten = nn.Flatten()
    

    然后

    >>> x.shape # nn.AdaptativeAveragePool2d output
    torch.Size([10, 256, 6, 6])
    >>> self.flatten(x)
    torch.Size([10, 9216])
    

最新更新