【问题标题】:How to calculate the output size after convolving and pooling to the input image对输入图像进行卷积和池化后如何计算输出大小
【发布时间】:2017-10-26 20:34:45
【问题描述】:

当我使用 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,则输出大小为 (24/2)*(24/2) = 12*12 而不是 14*14。那有意义吗?请告诉我有关如何计算卷积和池化后输出大小的详细信息。非常感谢。 下图是论文中CNN的过程。 image of the CNN process

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

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

padding = 'SAME' 表示输出大小与输入大小相同----图像大小。然后卷积后输出大小为28*28,池化后最终输出大小为(28/2)*(28/2) = 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')

【问题讨论】:

标签: python tensorflow


【解决方案1】:

举个例子。

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

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

填充(P):0

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

步幅 (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 = (26/2)+1 = (13)+1 = 14

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我明白了。非常感谢。我应该更仔细地阅读 tensorflow API。
    • 如果你知道的话,请告诉我在哪里可以找到 tensorflow API 的详细描述。我是张量流的大一新生。再次感谢。
    • 标准看的地方当然是官方API documentation。可以在Theano documention 中找到对不同卷积的很好解释
    • 得到它!这是一个如此简单的问题!很抱歉给您带来了困扰
    【解决方案3】:

    如果你使用的是 tensorflow,可以在这里找到更详细的讨论:What is the difference between 'SAME' and 'VALID' padding in tf.nn.max_pool of tensorflow?

    【讨论】:

      【解决方案4】:

      假设您的图像大小为n*n,而您的转换过滤器大小为f*f

      如果你使用有效的卷积(这意味着你有零填充)输出大小是(n-f+1)*(n-f+1)

      如果您希望输出和输入具有相同的维度,您应该使用相同的 conv,并且填充的大小为:p = (f-1)/2(我们通常使用 f 的奇数大小)

      如果您想要一个通用公式,如果您的输入大小为n*n,卷积核大小为f*f,填充大小为p,步幅大小为s,则输出将为:(((n+2p-f)/s)+1)*(((n+2p-f)/s)+1)

      第一个括号是高度,第二个是宽度

      【讨论】:

        猜你喜欢
        • 2017-03-13
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多