PyTorch Conv1D输出形状与预期不符问题咨询
问题:Conv1D输出形状与输入相同的原因分析
用户搭建的判别器网络代码如下:
class Discriminator(nn.Module): def __init__(self, input_size, output_size): super(Discriminator, self).__init__() self.main = nn.Sequential( nn.Conv1d(1, 3000, 1), nn.LeakyReLU(0.2), nn.Conv1d(3000, 1, 1), nn.Sigmoid() ) def forward(self, x): return self.main(x.float()) Discriminator = Discriminator()
训练时输入d_real_data的形状为[60, 1, 3000](batch size=60,通道数=1,序列长度=3000),预期输出形状为[60,1,1],但实际输出形状为[60,1,3000],疑问为何Conv1D返回与输入形状相同的输出。
解答
核心原因是你使用的卷积核大小为1,且未修改stride(步长)和padding(填充)的默认值,导致输出序列长度和输入完全一致。
PyTorch中Conv1D的输出序列长度计算公式为:
L_out = floor((L_in + 2*padding - kernel_size) / stride) + 1
默认参数下stride=1、padding=0,代入你的参数计算:
- 第一个Conv1D层:输入序列长度3000,卷积核大小1,计算得
(3000 + 0 -1)/1 +1 = 3000,输出形状为[60, 3000, 3000] - 第二个Conv1D层:输入序列长度仍是3000,卷积核大小1,计算后输出序列长度还是3000,最终输出形状为
[60,1,3000]
如果想要得到预期的[60,1,1]输出,有两种常用方案:
- 方案一:使用自适应池化层:在第二个Conv1D后添加全局自适应池化,比如
nn.AdaptiveAvgPool1d(1),不管输入序列长度多少,都会将其压缩为长度1,示例修改如下:self.main = nn.Sequential( nn.Conv1d(1, 3000, 1), nn.LeakyReLU(0.2), nn.Conv1d(3000, 1, 1), nn.AdaptiveAvgPool1d(1), nn.Sigmoid() ) - 方案二:调整最后一层卷积核大小:将最后一个Conv1D的卷积核大小设为输入序列长度3000,即
nn.Conv1d(3000,1,3000),此时输出序列长度计算为(3000 +0 -3000)/1 +1=1,最终输出形状为[60,1,1]
内容的提问来源于stack exchange,提问作者Jpark9061
相关产品推荐
相关产品推荐

