暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何计算CNN的感受野?

南极Python 2021-10-28
833

卷积再回顾

你可能经常看到,两个3x3
的卷积核或者单独一个5x5
的卷积核的感受野大小是相同的。

那么问题来了:

  • 为何两者的感受野大小会相同呢?
  • 既然相同,那为何大多数时候都选择两个3x3
    的卷积核呢?

对于第一个问题,可以用特征图尺寸计算公式来验证:

假设输入特征图尺寸为10x10
, ,执行普通的卷积,无padding,stride=1,

对于两个3x3
卷积:第一次卷积输出的特征图尺寸为,第二次卷积输出的特征图尺寸为

对于一个5x5
卷积:输出特征图尺寸为

对于第二个问题,答案就是显著降低了参数量。

具体地,对于卷积层而言,需要学习的参数就是卷积核对应的参数。不考虑偏置项,假设输入特征图的通道数为,输出通道数为,对于两个尺寸为3x3
的卷积核而言,所具有的参数量为,二对于一个尺寸为5x5
的卷积核而言,所具有的参数量为

由此可见,前者拥有更小的参数量。

计算感受野

所谓感受野,就是输出特征图中的某一个像素点能够看到输入特征图区域的大小。通常,我们会将多个卷积层堆叠在一起,因此感受野的概念是某一层相对于另一层来讲的。关于这一点,看完下面的栗子一个就清楚了。

感受野计算公式如下(自顶向下的计算方法):

F(i,j)表示第i层关于第j层的感受野。

可以通过下面的栗子体会下,其中卷积核尺寸是3,stride是1:

第3个隐藏层关于自身的感受野F(3,3)=1

第3个隐藏层关于第2个隐藏层的感受野是F(3,2)=(1-1)*1+3=3

第3个隐藏层关于第1个隐藏层的感受野是F(3,1)=(3-1)*1+3=5

第3个隐藏层关于输入层的感受野是F(3,0)=(5-1)*1+3=7

第2个隐藏层关于自身的感受野F(2,2)=1

第2个隐藏层关于第1个隐藏层的感受野是F(2,1)=(1-1)*1+3=3

第2个隐藏层关于输入层的感受野是F(2,0)=(3-1)*1+3=5

第1个隐藏层关于自身的感受野F(1,1)=1

第1个隐藏层关于输入层的感受野是F(1,0)=(1-1)*1+3=3

膨胀卷积

为了在不增加参数量的前提下扩大感受野,膨胀卷积出现了。

和普通卷积相比,膨胀卷积就是在卷积核中间插入了一些"空洞",这些空洞用某个固定值,比如0来表示。因此,膨胀卷积也称为空洞卷积。

这样一来,卷积核携带的参数量并没有变化(因为空洞用固定值进行了填充,这些空洞不需要学习),但是卷积核的尺寸却因为空洞的存在而变大了,根据上一部分的感受野计算公式可以知道,感受野也随之变大了。

膨胀率为D时,在尺寸为K的卷积核每两个元素之间插入D-1个空洞,于是卷积核的尺寸实际上变成了K+(K-1)*(D-1).

当D为1时,就是普通卷积。

D=2:

D=3:

注意,当使用膨胀卷积时,感受野计算公式也发生了变化:

以上。

参考:

  • [1] https://zhuanlan.zhihu.com/p/56940729
  • [2] https://www.bilibili.com/video/BV1q7411T7Y6?from=search&seid=3824716132556912322&spm_id_from=333.337.0.0
  • [3] 邱锡鹏《神经网络与深度学习》
  • [4] https://nndl.github.io/v/cnn-conv-more

南极Python交流群已成立,长按下方二维码添加我的微信,备注加群即可,欢迎进群学习交流(划水

文章转载自南极Python,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论