关于
'SAME'
填充
Convolution
文档提供了一些详细的解释(在
notes
)尤其是在使用
“同一”
填充,输出形状的定义如下:
# for `tf.layers.conv2d` with `SAME` padding:
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))
在这种情况下,输出形状仅取决于输入形状和跨距。从那里计算填充大小以满足此形状要求(而
'VALID'
填充,它是输出形状,取决于填充大小)
现在对于转置卷积…由于此操作是正态卷积(其梯度)的后向对应项,因此意味着正态卷积的输出形状对应于输入形状与其对应的转置操作。换句话说,当
tf.layers.conv2d()
除以步幅,输出形状
属于
tf.layers.conv2d_transpose()
乘以它:
# for `tf.layers.conv2d_transpose()` with `SAME` padding:
out_height = in_height * strides[1]
out_width = in_width * strides[2]
但是,再次计算填充大小是为了获得这个输出形状,而不是相反(对于
SAME
填充物)。因为这些值之间的正常关系(即您找到的关系)是:
# for `tf.layers.conv2d_transpose()` with given padding:
out_height = strides[1] * (in_height - 1) + kernel_size[0] - 2 * padding_height
out_width = strides[2] * (in_width - 1) + kernel_size[1] - 2 * padding_width
重新排列我们得到的方程
padding_height = [strides[1] * (in_height - 1) + kernel_size[0] - out_height] / 2
padding_width = [[strides[2] * (in_width - 1) + kernel_size[1] - out_width] / 2
注:
如果例如
2 * padding_height
是个奇数,那么
padding_height_top = floor(padding_height)
和
padding_height_bottom = ceil(padding_height)
(同样适用于Resp.
padding_width
,
padding_width_left
和
padding_width_right)
替代
out_height
和
out_width
使用它们的表达式,并使用您的值(对于第一个转置卷积):
padding = [2 * (128 - 1) + 4 - (128 * 2)] / 2 = 1
因此你有一个填充物
1
添加到数据的每一侧,以获取输出dim
out_dim = in_dim * stride = strides * (in_dim - 1) + kernel_size - 2 * padding = 256