入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。
目录
一、感受野(知道的可以直接跳)
二、空洞卷积的原理
三、空洞卷积的作用
1、扩大感受野
2、捕获多尺度上下文信息
四、空洞卷积的缺点
1、网格效应
2、远距离的信息可能不相关
五、空洞卷积的改进——HDC(混合空洞卷积)
感受野指:卷积神经网络每一层输出的特征图上的像素点在输入图片上映射的区域大小,即FC层每个输出节点的值都依赖FC层所有输入,而CONV层每个输出节点的值仅依赖CONV层输入的一个区域,这个区域之外的其他输入值都不会影响输出值,该区域就是感受野。简单来说就是特征图上的一个点对应输入图上的区域。
举个栗子:一个5*5的特征图经过2个3*3卷积核后(步长为1,padding为0)的感受野是5*5
注:计算感受野的大小时忽略了图像边缘的影响,即不考虑padding的大小
计算方式:先计算最深层在前一层上的感受野,然后逐层传递到第一层
(1)最后一层(卷积层或池化层)输出特征图感受野的大小等于卷积核的大小
(2)其他层感受野计算公式:
其中,是第i层卷积层的感受野,是(i+1)层上的感受野,stride是卷积的步长,Ksize是本层卷积核的大小。
空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中相邻两个值内填充dilation rate-1个0
比如说一个3*3卷积核,dilation rate=2,那么如图所示
一般来说,在深度神经网络中增加感受野并且减少计算量的方法是下采样。但是下采样牺牲了空间分辨率和一些输入的信息。
空洞卷积一方面增大了感受野可以检测分割大目标,另一方面相较于下采样增大了分辨率可以精确定位目标。
当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息
仅仅多次叠加 dilation rate 相同的相同尺寸卷积核,会导致kernel 不连续,进而导致不是所有的像素都用来计算了,因此这会损失信息的连续性。
如下图所示
(那张白色的网格就相当于输入的图片,然后蓝色组成的那个框框就是卷积核,红色的点代表正在处理的像素点)
可以看到红色点的旁边那一圈白色的像素点从头到尾都没有被利用到(都被乘0),所以红色那一点卷积后没有考虑到旁边这些白点的信息。
如果光采用大的扩张率的卷积可能只对一些大物体分割有效果,那么对小目标来说就不太友好了。因此设计好空洞卷积层的关键在于如何同时处理不同大小物体的关系。
1、叠加卷积的 dilation rate 不能有大于1的公约数,防止出现网格效应。比如【2,4,8】不行。
2、将扩张率设计成锯齿状结构,如[1,2,5,1,2,5]
空洞卷积代码实现:
conv=tf.nn.atrous_conv2d(X,W,rate,padding)
欢迎大家在评论区批评指正,谢谢~