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

Passing the output from the last Convolutional layer to the FCC layer - 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,但它也不起作用。

这也是我的 class 用于将输出从 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。 非常感谢您。

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

  1. CNN 和分类器之间的 nn.AdaptativeAveragePool2d 层将输出形状为 (10, 256, 6, 6) 的张量。因为您已经使用 (6, 6)output_size 初始化了它。也就是说,第一个全连接层应该有 256*6*6 个神经元。

    self.fc = nn.Linear(in_features=9216, out_features=4096)
    

这符合您当前模型的设置,而不是您建议的 20736...

  1. 你的分类器输入形状应该被展平,这可以通过定义展平层来完成 nn.Flatten (or using )。首先在初始化器中定义你的图层:

    self.flatten = nn.Flatten()
    

    然后

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