TensorFlow中相连卷积层的维度如何衔接?
关于TensorFlow卷积层输出形状的疑问解答
我猜你是疑惑为什么第二个卷积层conv2的空间维度(28×28)和conv1完全一致,只有通道数发生了变化对吧?其实核心原因就藏在你设置的参数里——咱们一步步拆解:
首先,你用了padding="same"这个关键参数,它的作用是在卷积运算前,自动给输入特征图的边缘填充适量的零,确保卷积后的输出特征图在高度和宽度上和输入保持一致。
以你用的kernel_size=[5,5]卷积核为例,TensorFlow会计算需要填充的像素数:(卷积核边长-1)//2,也就是(5-1)//2=2。这意味着会在特征图的上下左右各填充2个零像素,这样卷积操作后,输出的高和宽就和输入的28保持不变了。
而filters参数负责控制输出的通道数:conv1用32个滤波器,所以输出32通道;conv2换成64个滤波器,输出通道数就变成64。所以conv2的完整输出形状应该是(28, 28, 64)。
给你整理下代码,更直观:
# 假设input_layer的形状为(28, 28, 输入通道数,比如1) conv1 = tf.layers.conv2d( inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu ) # conv1输出形状:(28, 28, 32) conv2 = tf.layers.conv2d( inputs=conv1, filters=64, kernel_size=[5, 5], padding="same", activation=tf.nn.relu ) # conv2输出形状:(28, 28, 64)
如果想验证这个逻辑,你可以把padding改成"valid"试试——这时候不会做任何填充,输出的高/宽会变成28 - 5 + 1 = 24,conv2的输出形状就会变成(24, 24, 64),对比一下就能更明白padding的作用啦。
内容的提问来源于stack exchange,提问作者mobiusinversion
相关产品推荐
相关产品推荐

