如何计算对输入图像进行卷积和池化后的输出大小

新手上路,请多包涵

当我通过 tensorflow 教程学习深度 mnist 时,我对输入图像进行卷积和池化后的输出大小有疑问。在教程中我们可以看到:

 W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
x_image = tf.reshape(x, [-1,28,28,1])

We then convolve x_image with the weight tensor, add the bias, apply
the ReLU function, and finally max pool. The max_pool_2x2 method
will reduce the image size to 14x14.

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

我认为处理输入图像有两个步骤:第一个卷积和第二个最大池?!卷积后输出大小为(28-5+1)*(28-5+1) = 24*24。那么最大池化的输入大小就是24*24。如果池大小为 2*2,则输出大小为 (242)*(242) = 12*12 而不是 14*14。那有意义吗?请告诉我有关如何计算卷积和池化后输出大小的详细信息。非常感谢。下图是一篇论文中CNN的处理过程。 CNN 过程的图像

我已经明白问题出在哪里了。

 def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

padding = ‘SAME’ 表示输出大小与输入大小相同——图像大小。然后卷积后输出大小为28*28,池化后最终输出大小为(282)*(282) = 14*14。但是如何解释下面关于padding = ‘SAME’的代码:

 def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                    strides=[1, 2, 2, 1], padding='SAME')

原文由 WangYang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 576
2 个回答

卷积层的输出大小取决于使用的填充算法。正如您在“卷积和池化”部分中看到的那样,在教程中,他们使用了 same 填充方法。这意味着输出形状与输入形状相同,并且输入在原始输入之外用零填充。

当您使用 valid 填充算法时,您对输出形状的估计是正确的。

原文由 dseuss 发布,翻译遵循 CC BY-SA 3.0 许可协议

让我们举个例子。

张量大小或形状:(宽度 = 28,高度 = 28)

卷积滤波器尺寸(F):(F_width = 5, F_height = 5)

填充(P):0

填充算法:有效(这意味着输出大小可以变化)

步幅 (S):1

使用等式:

输出宽度=((W-F+2*P)/S)+1

输出宽度= ((28-5+2*0)/1) + 1

输出宽度 = 24

考虑到它们具有相同的尺寸,相同的答案将对输出高度有效。

所以输出维度将为 (24,24)。

但是,如果填充算法设置为“相同”,则输出的大小等于原始输入的大小。

还请记住,池化是“过滤器”的一种形式,因此上述过滤器方程是适用的。

因此,步幅为 2 的 2x2 池化,使用相同的等式 (((W-F+2*P)/S)+1) 将为我们提供:

= ((28-2+2*0)/2) + 1 = (262)+1 = (13)+1 = 14

这是我曾经发布到 Quora 的答案的链接。

https://www.quora.com/How-can-I-calculate-the-size-of-output-of-convolutional-layer/answer/Rockson-Agyeman

原文由 rocksyne 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题