Moh*_*nan 1 python tensorflow convolutional-neural-network
我[-1,256,256,3]使用如下所示的转置图层作为输出形状。我打印输出形状。我的问题特别是关于高度和宽度这两者的问题256。通道似乎是我代码中最后一个转置层的滤波器数量。
我相当简单地假设公式是这样的。我读了其他主题。
H = (H1 - 1)*stride + HF - 2*padding
Run Code Online (Sandbox Code Playgroud)
但是当我计算时,我似乎没有得到该输出。我想我可能会缺少填充计算,那么添加了多少填充'SAME'?
我的代码是这个。
H = (H1 - 1)*stride + HF - 2*padding
Run Code Online (Sandbox Code Playgroud)
关于'SAME'填充,Convolution文档提供了一些详细的解释(这些注释中的更多详细信息)。特别是在使用'SAME'填充时,输出形状的定义如下:
Run Code Online (Sandbox Code Playgroud)# 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]
Run Code Online (Sandbox Code Playgroud)
但是还是要再次计算出填充大小,以获取此输出形状,而不是相反(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
Run Code Online (Sandbox Code Playgroud)
重新排列我们得到的方程式
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
Run Code Online (Sandbox Code Playgroud)
注意:如果例如
2 * padding_height是一个奇数,则padding_height_top = floor(padding_height); 和padding_height_bottom = ceil(padding_height)(与分别相同padding_width,padding_width_left和padding_width_right)
更换out_height并out_width与他们的表情,并使用您的值(第1调换卷积):
padding = [2 * (128 - 1) + 4 - (128 * 2)] / 2 = 1
Run Code Online (Sandbox Code Playgroud)
因此1,您需要在数据的每一侧添加一个填充,以便获得输出暗淡out_dim = in_dim * stride = strides * (in_dim - 1) + kernel_size - 2 * padding = 256
| 归档时间: |
|
| 查看次数: |
3416 次 |
| 最近记录: |