当使用tensorflow创建卷积神经网络时,肯定要用到卷积层和池化层,tendorflow关于建立卷积层和池化层的API都有padding这个参数,如下所示:
- tf.nn.conv2d(input,filter,strides,padding)
- tf.nn.max_pool(input,ksize,strides,padding)
padding有两种可选值:‘VALID’和‘SAME’。
取值为‘VALID’时padding=0,并不会对输入(input)做填充;
取值为‘SAME’时padding>0,将会对输入(input)做填充,填充值都是0值。
下面我将分别对卷积和池化中padding取值为‘VALID’和‘SAME’的区别做详细的解释。
---------------------------------------------------------------------------------------------------------
卷积 tf.nn.conv2d(input,filter,strides,padding)
在tf.nn.conv2d中,padding是在图片周围做填充。
padding='VALID'时不会对图片做填充;
padding='SAME'时情况比较特殊,注意!,这里还要分为两种情况:stride=1和stride>1
1.当且仅当stride=1时,padding='SAME'意味着卷积后的输出与输入size保持一致。例如input的size是5×5,kernel(filter)的size是3×3,令padding='SAME'时(此时padding=1,即在input周围填充了一圈0),output的size将会与input的size保持一致为5×5。
当我们使用tensorflow时,取padding='SAME'时,它自动为我们算出padding的值。既然是详解,那么我们来算一下取padding='SAME'时,padding的值应该取几?先说结论:假如kernel的size是k×k,那么padding=(k-1)/2。
解释:o=(i+2p-k+1)
o为output的size,i为input的size,k为kernal的size,p为padding的取值。以上图为例,i=5,padding=1,k=3,kernel还要向右移动4步加上开始总共生成5个像素(即output的第一行),o就等于5。(如果对卷积过程比较熟悉应该不难理解)
2.当stride>1时,还是直接上公式:
o=((i+2p-k)/s+1)
是不是发现s=1就是上面的公式?当stride>1时,p的取值是能使(i+2p-k)能被s整除的最小值(p>k/2)。
以Alexnet的输入层(227×227)到第二层(55×55)为例子,k=11,stride=4,padding='VALID';
假如我们令padding='SAME',我们看一下输出层size是多少?
能使(227+2p-11)被4整除的最小p值是4,所以o=((227+2×4-11)/4+1)=57,这时第二层的size就变成了57×57。代码可以在这里获取,有兴趣的可以看一下。
---------------------------------------------------------------------------------------------------------------------
池化 tf.nn.max_pool(input,ksize,strides,padding)
对于tf.nn.max_pool来说,padding='SAME'和'VALID'的区别我们来举例说明:
输入x
: 输入图像的shape 是 [2,3], 1个channel
valid_pad
: kernel的size为2×2, stride 2 ,padding='VALID'.
same_pad
: kernel的size为2×2, stride 2 ,padding='VALID'
输出结果:
valid_pad
: 输出的shape 是 [1, 1]
same_pad
: 这里我们将会把x的shape填充为 shape [2, 4] (with -inf
and then apply max pool), 所以最终输出的 shape 是 [1, 2]
废话不说,上代码:
呼~,终于结束了,参考资料在下面:
What does the "same" padding parameter in convolution mean in TensorFlow?
what is the behavior of SAME padding when stride is greater than 1?
What is the difference between 'SAME' and 'VALID' padding in tf.nn.max_pool of tensorflow?