如何计算卷积和汇集到输入imag后的输出大小

2024-05-20 00:00:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用tensorflow教程学习deep 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)

我认为有两个步骤来处理输入图像:First卷积和second max pool?!卷积后,输出大小为(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='相同'的代码:

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

Tags: the图像imagetf教程nnvariable卷积
3条回答

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

举个例子。

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

卷积滤波器尺寸(F):(F_宽度=5,F_高度=5)

填充(p):0

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

步幅:1

使用公式:

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

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

输出宽度=24

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

所以输出维数是(24,24)。

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

还要记住,池是“过滤器”的一种形式,因此上面的文件管理器方程是可应用的。

因此,使用相同的方程(((W-F+2*p)/S)+1),跨距为2的2x2池将给出:

= ((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

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

当使用valid填充算法时,对输出形状的估计为真。

相关问题 更多 >