You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,代入你的参数计算:

  1. 第一个Conv1D层:输入序列长度3000,卷积核大小1,计算得(3000 + 0 -1)/1 +1 = 3000,输出形状为[60, 3000, 3000]
  2. 第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:14:59