tensorflow 中的padding方式“SAME”和“VALID”

tensorflow 中的padding方式“SAME”和“VALID”

因为最近在看一些目标检测的代码,想计算每一层的卷积或者pooling的输出大小,所以把这一块严格看一下,
同时有助于自己设计网络,比如什么时候要padd之类的。
tensorflow 中的padding方式“SAME”和“VALID”
    在tensorflow里面,这两个计算特征图的输出大小方式不一样,

    如果padding的方法为“SAME” ,那么输出特征图的长和宽为:

    $$w_out=\frac{w-F+1}{s}$$

    其中w表示输入特征图的长/宽,s表示strides,表示卷积核的大小,然后向上取整


     如果padding的方法为“VALID” ,那么输出特征图的长和宽为:
     $$w_out=\frac{w}/{s}$$
 其中w表示输入特征图的长/宽,s表示strides,然后向上取整

我们看一个tensorflow的例子
import tensorflow as tf
import numpy as np
x = tf.reshape(tf.range(0,25*3),[1,5,5,3])

valid_pad = tf.nn.max_pool(x, ksize=[1, 3, 3, 1], strides=[1, 1, 1, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME')



print("Valid_pad = ",valid_pad.get_shape())
print("Same_pad = ",same_pad.get_shape())

我们看看结果:
Valid_pad =  (1, 4, 4, 3)
Same_pad =  (1, 5, 5, 3)


结果和公式很吻合,但是需要注意,我这个地方是strides=1,如果我们在草稿纸上自己绘图,移动,会误以为这两个方式一样,其实是不一样的。
那我们在看一种情况:
import tensorflow as tf
import numpy as np
x = tf.reshape(tf.range(0,6*6*3),[1,6,6,3])
valid_pad = tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
print("Valid_pad = ",valid_pad.get_shape())
print("Same_pad = ",same_pad.get_shape())
结果是:
Valid_pad =  (1, 3, 3, 3)
Same_pad =  (1, 3, 3, 3)
这下就是输出形状就是一样的了,我们在看看,到底这两个输出值是不是相等

import tensorflow as tf
import numpy as np
x = tf.reshape(tf.range(0,6*6*3),[1,6,6,3])
valid_pad = tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
with tf.Session() as sess:
    valid_pad, same_pad = sess.run([valid_pad,same_pad])
if valid_pad.all() == same_pad.all():
    print("equal")
else:
    print("unequal")
print(valid_pad)
print(same_pad)
结果是equal,
[[[[ 21  22  23]
   [ 27  28  29]
   [ 33  34  35]]




  [[ 57  58  59]
   [ 63  64  65]
   [ 69  70  71]]

  [[ 93  94  95]
   [ 99 100 101]
   [105 106 107]]]]
[[[[ 21  22  23]
   [ 27  28  29]
   [ 33  34  35]]

  [[ 57  58  59]
   [ 63  64  65]
   [ 69  70  71]]

  [[ 93  94  95]
   [ 99 100 101]
   [105 106 107]]]]

这种刚好可以整除的情况就是一样的,我们自己手动滑窗口也是一样,除了strides=1的情况。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值