为什么卷积核通常都是奇数(1x1、3x3...)

使用小的卷积核代替大卷积核的目的有两个,第一,降低参数数量,第二,顺带的效果是增加了网络深度。

1,为了方便same padding时的处理。如步长为1时,要补充k-1的zero padding才能使输出输出的尺寸一致,这时候如果核大小k是偶数,则需要补充奇数的zero padding,不能平均分到feature map的两侧。

padding时对称:保证了 padding 时,图像的两边依然相 对称 。 在卷积时,我们有时候需要卷积前后的尺寸不变。这时候我们就需要用到padding。假设图像的大小,也就是被卷积对象的大小为nn,卷积核大小为kk,padding的幅度设为(k-1)/2时,卷积后的输出就为(n-k+2((k-1)/2))/1+1=n,即卷积输出为nn,保证了卷积前后尺寸不变。但是如果k是偶数的话,(k-1)/2就不是整数了。

输出图像大小 = (输入图片大小 - 卷积核大小 + 2*padding)/ stride步长 + 1

见下图,输入图像大小4x4,如果通过3x3卷积,输出图像大小不变,那么(4 - 3 + x) / 1 + 1 = 4.需要padding大小为x = 2,那么上下左右各填0即可,

如下图,如果采用偶数2x2卷积,那么需要(4 - 2 + x) / 1 + 1.= 4填充为x = 1,那么只能在一边添加。

2,为了统一标准。卷积核的滑动是默认使用中心点作为基准而进行的,而奇数核拥有这样天然的基准。这样每次计算完后的数放在中心位置。(其实自己定义偶数核的基准也是可以的,如使用核的左上角作为基准。)

3,为了更好地获取中心信息。由于奇数核拥有天然的绝对中心点,因此在做卷积的时候能更好地获取到中心这样的概念信息。

保护位置信息:保证了锚点刚好在中间,方便以模块中心为标准进行滑动卷积,避免了位置信息发生偏移 。 在CNN中,进行卷积操作时一般会以卷积核模块的一个位置为基准进行滑动,这个基准通常就是卷积核模块的中心。若卷积核为奇数,卷积锚点很好找,自然就是卷积模块中心,但如果卷积核是偶数,这时候就没有办法确定了,让谁是锚点似乎都不怎么好。

道生一,一生二,二生三,三生万物

综上,卷积核一般都把size设为奇数,主要有以下两个原因:

1.保证锚点(卷积核的中心)刚好在中间,方便以模块中心为标准进行滑动卷积。

2.保证了padding时,图像的两边依然相对称

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章