tensorflow卷积神经网络中的padding参数最详细解释!
当使用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]
废话不说,上代码: