pytorch 如何正确使用AdaptiveAvgPool进行全局池化?

vbopmzt1  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(224)

我正在尝试将使用Flatten/Linear作为最终层的模型转换为使用AdapativeAvgPool1d/Linear的全局池。全局池后线性层的输出维度会扰乱训练阶段。我收到以下错误:

ValueError: operands could not be broadcast together with shapes (64,4) (64,)

展平模型--〉线性(工程)

conv1d --> relu --> maxpool1d --> Flatten --> Linear

model = nn.Sequential(
            nn.Conv1d(in_channels=1, out_channels=32, kernel_size=128, stride=16, padding=1),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2, stride=2),
            nn.Flatten(),
            nn.LazyLinear(n_classes)
    )
==========================================================================================
Layer (type:depth-idx)                   Output Shape              Param #
==========================================================================================
Sequential                               --                        --
├─Conv1d: 1-1                            [64, 32, 505]             4,128
├─ReLU: 1-2                              [64, 32, 505]             --
├─MaxPool1d: 1-3                         [64, 32, 252]             --
├─Flatten: 1-4                           [64, 8064]                --
├─Linear: 1-5                            [64, 4]                   32,260
==========================================================================================

具有AdaptiveAvgPool1d的模型--〉线性(输出尺寸错误)

我希望此实现的输出与上一个实现的输出相匹配,其中Linear图层的输出形状为[64,4]

model = nn.Sequential(
            nn.Conv1d(in_channels=1, out_channels=32, kernel_size=128, stride=16, padding=1),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2, stride=2),
            nn.AdaptiveAvgPool1d(1),
            nn.LazyLinear(n_classes)
    )    
==========================================================================================
Layer (type:depth-idx)                   Output Shape              Param #
==========================================================================================
Sequential                               --                        --
├─Conv1d: 1-1                            [64, 32, 505]             4,128
├─ReLU: 1-2                              [64, 32, 505]             --
├─MaxPool1d: 1-3                         [64, 32, 252]             --
├─AdaptiveAvgPool1d: 1-4                 [64, 32, 1]               --
├─Linear: 1-5                            [64, 32, 4]               8
==========================================================================================
vqlkdk9b

vqlkdk9b1#

您不能将nn.Flatten替换为nn.AdaptiveAvgPool1d,因为它们的作用不同。您仍需要在nn.AdaptiveAvgPool1d之后添加nn.Flatten()以获得相同的输出形状。

相关问题