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

2024-05-23 19:12:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将输出从最后一个卷积层传递到FCC层,但我正在与维度作斗争。默认情况下,网络使用AdaptiveAvgPool2d(输出大小=(6,6))什么不允许我使用火炬。出于再现性目的,使用确定性算法(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,3350350]。 最后一个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。 事先非常感谢你


Tags: selffalsetruesizekernelidentityfeaturespadding
1条回答
网友
1楼 · 发布于 2024-05-23 19:12:13

TLDR;完全连接层中的神经元数量正常,但形状不正常。

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

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

这与当前模型的设置相匹配,而不是建议的20736

  1. 您的分类器输入形状应该被展平,这可以通过定义展平层^{}(或使用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])
    

相关问题 更多 >