tf.pad返回[?,?,?]形状的原因及Conv1D报错问题咨询
解决Conv1D自定义填充后的形状报错问题
咱们先从你代码里的核心错误说起:
1. Padding张量的定义语法错误
你写的padding=tf.constant([0,0],[5,0],[0,0])是不对的——tf.constant只接受一个张量值作为第一个参数,你把三个独立的列表传进去,TensorFlow根本没法正确解析你的填充规则,这直接导致填充后的张量形状完全无法被推断,所以才会出现(?,?,?)的未知形状。
正确的做法是把三个维度的填充规则打包成一个二维列表,传给tf.constant:
padding = tf.constant([[0, 0], [5, 0], [0, 0]])
这个二维列表的每一行对应输入张量的一个维度,每行的两个值分别是该维度前面和后面要填充的元素数量:
- 第0行
[0,0]:批量维度(就是你x里的None)前后都不填充,保持原批量大小 - 第1行
[5,0]:序列维度(原长度50)前面填充5个元素,后面不填,填充后长度变成55 - 第2行
[0,0]:通道维度(原长度1)前后都不填充,保持1不变
2. 修正后的形状与Conv1D兼容性
修正padding定义后,执行y=tf.pad(x,padding),y的形状会变成[None, 55, 1]——通道维度明确是1,完全符合tf.layers.conv1d对输入通道维度必须确定的要求,不会再触发报错。
另外提一句,如果你用的是TensorFlow 2.x版本,其实可以不用单独定义tf.constant,直接把填充规则列表传给tf.pad更简洁:
y = tf.pad(x, [[0, 0], [5, 0], [0, 0]])
内容的提问来源于stack exchange,提问作者Carol.Z
相关产品推荐
相关产品推荐

