TensorFlow tf.nn.conv2d_transpose参数疑问:如何确定滤波器形状?
我来帮你把这个问题掰明白~其实tf.nn.conv2d_transpose的filter形状规则和咱们常用的普通卷积层(tf.nn.conv2d)是对应的,只是通道维度的顺序有个关键变化。
首先先明确这个函数里filter的通用形状:[filter_height, filter_width, output_channels, input_channels]
咱们拆解一下每个维度的含义:
filter_height和filter_width:就是你要使用的卷积核的高度和宽度,这个可以根据需求选择,比如常用的3x3、5x5都可以,只要后续能匹配上输出形状的计算就行。output_channels:必须和你指定的output_shape的最后一个维度完全一致(也就是你例子里的64)。input_channels:必须和输入张量value的最后一个维度完全一致(也就是你例子里的128)。
再结合你的具体场景来看:
你的输入张量是[batch_size,7,7,128],目标输出是[batch_size,14,14,64],strides实际传参时需要是长度为4的列表[1,2,2,1](你说的[2,2]是height和width方向的步长,对应列表的第2、3位),padding是'SAME'。
假设你选用最常用的3x3卷积核,那filter的形状就应该是[3,3,64,128]。这里验证下输出形状:当padding为'SAME'、步长是2时,输入高度7×2刚好得到输出高度14,完全符合你的需求。如果选5x5的卷积核,filter形状就是[5,5,64,128],同样也能满足输出形状要求,只要卷积核尺寸是奇数,在'SAME' padding下都能保证输入×步长得到输出尺寸。
最后提个关键点:为什么filter的通道顺序是output_channels在前、input_channels在后?这是因为转置卷积本质上可以理解为普通卷积的反向传播过程,所以通道维度的顺序和普通卷积是反过来的——普通卷积的filter是[filter_h, filter_w, input_channels, output_channels],转置卷积刚好倒过来,这样才能在计算时和正向卷积的参数对应上。
内容的提问来源于stack exchange,提问作者user7641438

