使用张量流

时间:2016-03-14 05:20:19

标签: neural-network tensorflow deep-learning conv-neural-network

根据此paper,输出形状为N + H - 1N为输入高度或宽度,H为内核高度或宽度。这是卷积的明显逆过程。这个tutorial给出了计算卷积输出形状的公式,(W−F+2P)/S+1W - 输入大小,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_shapex_shape(W−F+2P)/S+1来计算填充大小P。从(12 - 3 + 2P) / 2 + 1 = 6开始,我们得到P = 0.5,这不是整数。解卷积如何在Tensorflow中发挥作用?

3 个答案:

答案 0 :(得分:6)

进行反卷积,

output_size = strides * (input_size-1) + kernel_size - 2*padding

strides,input_size,kernel_size,padding是整数 “有效”

的填充为零

答案 1 :(得分:3)

本教程中输出大小的公式假设填充POSIXct在图像之前和之后(左侧和右侧或顶部和底部)相同。 然后,你放置内核的地方数量是: POSIXlt

但是,tensorflow还可以处理你需要将更多像素填充到一侧而不是另一侧的情况,以便内核能够正确匹配。您可以在docs中详细了解选择填充(PW (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=1pad_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 documentpad_top=1/2pad_left=1/2 } padding ='VALID'部分都是0。