CNN中有一个概念叫局部感受野(local receptive field),那什么是感受野呢?一般的CNN结构都是卷积-池化这样重复下去,比如下表:
layers | size | stride |
input | 100*100*1 | --- |
conv1 | 3*3 | 1 |
pool1 | 2*2 | 2 |
conv2 | 3*3 | 1 |
pool2 | 2*2 | 2 |
conv3 | 3*3 | 1 |
pool3 | 2*2 | 2 |
那么感受野(RF)就是每一层得到的feature map中的一个值是由原图中多大范围的像素点计算得到的,这儿先说明一下:padding并不影响感受野,stride只影响下一层feature map的感受野,size影响的是本层的感受野。
那么怎么计算呢,一般都是从输出倒推向输入,有一个非常简单的公式:
以上表的结构计算一下,假设最后一层pool3的的输出为1*1的一个数据点,那么根据公式倒推如下:
pool3 | (1-1)*2+2= | 2 |
conv3 | (2-1)*1+3= | 4 |
pool2 | (4-1)*2+2= | 8 |
conv2 | (8-1)*1+3= | 10 |
pool1 | (10-1)*2+2 | 20 |
conv1 | (20-1)*1+3 | 22 |
意思就是说pool3的感受野大小就是22*22,原图中22*22大小的数据经过网络计算得出了pool3的一个点
finally,
大家仔细观察计算过程可以发现,感受野的大小和卷积核size大小、池化有着密切的关系,所以增大感受野有如下方法:
- 增加卷积核大小
- 池化
- 使用空洞卷积
空洞卷积可以参考知乎上的一个讨论:https://www.zhihu.com/question/54149221/answer/192246237
如有错误,请指正,感谢!