Conv2D使用公式转置输出形状

时间:2018-06-04 14:36:11

标签: python tensorflow convolutional-neural-network

我使用下面显示的转置图层将committedOffsets()作为输出形状。我打印输出形状。我的问题是高度和宽度都是$query = $this->getUserRepository() ->createQueryBuilder('du') ->delete('LottolandBundle:User','du') ->where('du.id = :id') ->setParameter("id", $id) ->getQuery() ->execute(); return $query; 。通道似乎是我代码中最后一个转置层的过滤器数量。

我相当简单地假设这个公式就是这个。我读了其他帖子。

[-1,256,256,3]

但是当我计算时,我似乎没有得到那个输出。我想我可能会错过填充计算   256添加了多少填充?

我的代码就是这个。

H = (H1 - 1)*stride + HF - 2*padding

2 个答案:

答案 0 :(得分:4)

关于'SAME'填充,Convolution文档提供了一些详细解释(notes中的更多详细信息)。特别是,当使用'SAME'填充时,输出形状定义为:

# 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)(分别为padding_widthpadding_width_leftpadding_width_right)

out_heightout_width替换为其表达式,并使用您的值(针对第一个转置卷积):

padding = [2 * (128 - 1) + 4 - (128 * 2)] / 2 = 1

因此,您的数据的每一面都添加了1的填充,以便获得输出暗淡out_dim = in_dim * stride = strides * (in_dim - 1) + kernel_size - 2 * padding = 256

答案 1 :(得分:1)

我根据@ Aldream的回答为自己画了一张图。可能有用于可视化。希望我做对了。但我必须研究如何以及在何处应用此填充以获得最终形状。

enter image description here