【问题标题】:Passing the output from the last Convolutional layer to the FCC layer - PyTorch将最后一个卷积层的输出传递到 FCC 层 - PyTorch
【发布时间】:2021-10-19 17:27:37
【问题描述】:

我正在尝试将最后一个卷积层的输出传递到 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。 非常感谢您。

【问题讨论】:

    标签: python machine-learning multidimensional-array neural-network pytorch


    【解决方案1】:

    TLDR;你的全连接层的神经元数量很好,你的形状不是。

    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(或使用an inline alternative)来完成。首先在初始化器中定义你的层:

      self.flatten = nn.Flatten()
      

      然后

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

    【讨论】:

    • 但我想将 nn.AdaptativeAveragePool2d 替换为 Identity() 以传递来自 feature的最后一层的输出> 到 分类器。我应该使用相同的想法吗?
    • 如果去掉自适应平均池,那么就需要改全连接层了,是的。当您收到错误消息时,您是否删除了平均池?
    • 是的,我做到了。 feature 最后一层的输出是 [10, 256, 9, 9]
    • 然后你必须设置完全连接到20 736 的神经元,并用我的 2.* 中描述的扁平层重塑 CNN 和分类器之间的张量回答。
    • 好的,完成。一切都很完美!非常感谢!
    猜你喜欢
    • 2018-07-26
    • 2019-01-16
    • 2021-11-09
    • 2017-10-06
    • 2022-01-05
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多