音频信号1D卷积输出仅5个值的实现及核参数无效问题咨询
问题解答
为什么修改核形状输出不变?
你当前用的是padding='SAME'且步长strides_1d=1,这种情况下1D卷积的输出长度会和输入长度完全一致——不管你调整核的宽度,TensorFlow都会自动在输入两端补零,保证每个输入位置都能对应一个输出位置。这就是改weight_1d大小后输出形状没变化的原因。
怎么得到5个输出值?
要固定输出为5个值,得结合步长、核宽度和padding方式计算,下面给两种可行方案:
方案1:用SAME padding,调整步长
根据SAME padding的输出长度公式:输出长度 = ceil(输入长度 / 步长)
已知输入长度是44097,要输出5个值,步长需满足ceil(44097 / 步长) = 5,计算得步长取8819或8820都可以(44097÷8819≈5.0002,向上取整为5;44097÷8820≈4.999,向上取整也为5)。
修改代码步长即可:
strides_1d = 8820 # 或8819
方案2:用VALID padding,搭配合适的步长与核宽度
VALID padding不补零,输出长度公式为:输出长度 = ceil( (输入长度 - 核宽度 + 1) / 步长 )
如果用常规的小核(比如宽度3),可以计算出步长为8819:ceil( (44097 - 3 + 1)/8819 ) = ceil(44095/8819) = 5
代码修改示例:
strides_1d = 8819 output_1d = tf.squeeze(tf.nn.conv1d(input_1d, kernel_1d, strides_1d, padding='VALID'))
额外说明
- 想用核大小控制输出,必须配合
VALIDpadding和合适的步长,SAMEpadding在步长为1时会锁死输出长度与输入一致。 - 实际场景中,用大步长降采样到5个值是更合理的选择,超大核的卷积没有实用价值。
内容的提问来源于stack exchange,提问作者A. Gehani
相关产品推荐
相关产品推荐

