卷积计算中的填充与步长

under 算法  tag CNN    Published on April 21st , 2019 at 11:41 am

在了解了卷积计算的原理后,我们很自然的就会面对一个问题:源图像经过卷积操作后得到的输出图像通常变小了
我们设输入图像的大小为$n*n$,过滤器的大小为$f*f$,那我们得到的输出矩阵的大小将为$$(n-f+1)*(n-f+1)$$
同时因为矩阵边缘的信息参与卷积的次数较少,会导致边缘信息的丢失。

为了解决这一问题,我们要在卷积计算中引入填充方法(padding)

padding1.png

如上图,输入图像的大小为$6*6$,过滤器的大小为$3*3$,通过计算可知输出图像应为$4*4$
为了维持图像大小不变,我们可以在输入图像外加一圈$0$像素点(通常用$0$进行padding)让输入图像的大小转换为$8*8$,通过计算$(8-3+1)*(8-3+1)=6*6$可知我们维持了图像大小不变

通过padding我们不仅可以维持输入输出图像大小相等,还让边缘信息向内移动,参与了更多次的卷积运算,更充分的利用的边缘信息

由此我们引出了两种卷积方式:
Vaild:指不对输入图像做padding操作
Same:指对输入图像做padding操作使得输入图像与输出图像大小相等
为了使输入输出图像大小相等,我们设需要padding的圈数为$p$

$$ n+2p-f+1=n \\\ p=\frac{f-1}{2} $$

由此我们引出了过滤器的大小选择问题,在实际应用中我们通常使用奇数维的过滤器,首先是因为$p=\frac{f-1}{2}$,为了保证$p\in N$,所以$f=2*k+1$,这样可以避免不对称的padding。还有一个原因是奇数维的过滤器会有一个中心点,在很多问题中过滤器的中心点是有意义的

在上述讨论中我们都默认过滤器在输入图像上的滑动都是以$1$为单位的,但在实际操作中一次跨$2$格也是允许并且有意义的。我们将每次滑动的格数叫做步长$s$
padding2.png
左侧$7*7$的输入图像与$3*3$的过滤器进行$s=2$的卷积后得到的输出图像为$3*3$,由此我们可以得到新的输出图像大小为
$$\lfloor \frac{n+2p-f}{s}+1 \rfloor$$
因为不能保证$n+2p-f$是$s$的整数倍,所以我们采用向下取整的策略,即只有当过滤器完全处在输入图像内部时,才做卷积运算


本文由 cxh 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:April 25th , 2019 at 12:51 pm
分享到:Twitter  Weibo  Facebook






  1. Mn

    学长牛逼! 另外加个解析cxh0519.cn的域名吧233 发现只解析了带www的

    Reply
    1. cxh
      @Mn

      哈哈哈好

      Reply
  2. Hawaii

    学长牛逼!

    Reply
    1. cxh
      @Hawaii

      学长菜鸡

      Reply
  3. cry

    我来辣

    Reply
    1. cxh
      @cry

      你来辣

      Reply
  4. 云起

    先码后看好习惯。

    Reply