根据此paper,输出形状为N + H - 1
,N
为输入高度或宽度,H
为内核高度或宽度。这是卷积的明显逆过程。这个tutorial给出了计算卷积输出形状的公式,(W−F+2P)/S+1
,W
- 输入大小,F
- 过滤器大小,P
- 填充大小,S
- 跨步。但在Tensorflow中,有一些测试用例如:
strides = [1, 2, 2, 1]
# Input, output: [batch, height, width, depth]
x_shape = [2, 6, 4, 3]
y_shape = [2, 12, 8, 2]
# Filter: [kernel_height, kernel_width, output_depth, input_depth]
f_shape = [3, 3, 2, 3]
因此,我们根据公式y_shape
使用f_shape
,x_shape
和(W−F+2P)/S+1
来计算填充大小P
。从(12 - 3 + 2P) / 2 + 1 = 6
开始,我们得到P = 0.5
,这不是整数。解卷积如何在Tensorflow中发挥作用?
答案 0 :(得分:6)
进行反卷积,
output_size = strides * (input_size-1) + kernel_size - 2*padding
strides,input_size,kernel_size,padding是整数 “有效”
的填充为零答案 1 :(得分:3)
本教程中输出大小的公式假设填充POSIXct
在图像之前和之后(左侧和右侧或顶部和底部)相同。
然后,你放置内核的地方数量是:
POSIXlt
。
但是,tensorflow还可以处理你需要将更多像素填充到一侧而不是另一侧的情况,以便内核能够正确匹配。您可以在docs中详细了解选择填充(P
和W (size of the image) - F (size of the kernel) + P (additional padding before) + P (additional padding after)
)的策略。您正在讨论的测试使用方法"SAME"
。
答案 2 :(得分:1)
这个讨论非常有用。只需添加一些其他信息。
padding='SAME'
也可以让底部和右侧获得一个额外的填充像素。根据{{3}}和下面的测试用例
strides = [1, 2, 2, 1]
# Input, output: [batch, height, width, depth]
x_shape = [2, 6, 4, 3]
y_shape = [2, 12, 8, 2]
# Filter: [kernel_height, kernel_width, output_depth, input_depth]
f_shape = [3, 3, 2, 3]
正在使用padding ='SAME'。我们可以将padding ='SAME'解释为:
(W−F+pad_along_height)/S+1 = out_height,
(W−F+pad_along_width)/S+1 = out_width.
所以(12 - 3 + pad_along_height) / 2 + 1 = 6
,我们得到pad_along_height=1
。 pad_top=pad_along_height/2 = 1/2 = 0
(整数除法),pad_bottom=pad_along_height-pad_top=1
。
对于padding ='VALID',如建议的名称,我们在适当的时候使用填充。首先,我们假设填充像素= 0,如果这不起作用,那么我们在原始输入图像区域之外的任何值处添加0填充。例如,下面的测试用例,
strides = [1, 2, 2, 1]
# Input, output: [batch, height, width, depth]
x_shape = [2, 6, 4, 3]
y_shape = [2, 13, 9, 2]
# Filter: [kernel_height, kernel_width, output_depth, input_depth]
f_shape = [3, 3, 2, 3]
conv2d
的输出形状是
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
= ceil(float(13 - 3 + 1) / float(3)) = ceil(11/3) = 6
= (W−F)/S + 1.
原因(W−F)/S+1 = (13-3)/2+1 = 6
,结果为整数,我们不需要在图片边框周围添加0像素,TensorFlow document中pad_top=1/2
,pad_left=1/2
} padding ='VALID'部分都是0。