Keras中Conv2D设置padding=SAME后输出尺寸仍缩小问题咨询
问题原因分析
你对tf.keras.layers.Conv2D中padding="SAME"的作用存在认知偏差,该参数的定义不是所有场景下都保持输入输出特征图尺寸一致:
- 仅当卷积步长
strides=(1,1)时,padding="SAME"才会通过补零让输出特征图的高宽和输入完全相等 - 当步长大于1时,
padding="SAME"的作用仅为补零保证边缘像素可以被卷积核覆盖,输出特征图的高宽仍然会按照步长比例缩小
TensorFlow官方定义的SAME模式下输出高宽计算公式为:
输出尺寸 = ceil(输入尺寸 / 步长)
你的代码中步长设置为(2,2),代入计算:
- 第一层输入尺寸120,输出为ceil(120/2) = 60
- 第二层输入尺寸60,输出为ceil(60/2) =30
和你实际运行得到的结果完全吻合,属于正常运行结果。
调整方案
如果你需要输出特征图尺寸和输入完全一致,可按需求选择以下配置:
- 不需要下采样场景:将两个Conv2D层的
strides参数改为(1,1),搭配padding="SAME"即可保持输出高宽为120x120
修改后的测试代码示例:
import tensorflow as tf x = tf.keras.Input([120, 120, 3]) # 步长改为1 conv = tf.keras.layers.Conv2D(filters=3, kernel_size=(3, 3), strides=(1, 1), padding="SAME")(x) conv = tf.keras.layers.Conv2D(filters=3, kernel_size=(3, 3), strides=(1, 1), padding="SAME")(conv) model = tf.keras.Model(inputs=[x], outputs=[conv]) model.summary()
- 需要下采样后恢复原尺寸场景:在网络后端搭配
Conv2DTranspose转置卷积、或UpSampling2D上采样层,即可恢复到输入尺寸。
内容的提问来源于stack exchange,提问作者TeeTracker
相关产品推荐
相关产品推荐

