首先放链接:https://www.zhihu.com/question/54149221
首先,初次接触dilated conv带孔卷积是在deeplab网络结构里,做图像分割。
本科毕设首次接触图像分割,当时用的是caffe框架,fcn-8s实现。但是,它会把图像pooling5次,最终的特征图尺寸缩小了32倍,然后结合倒数后两层的信息(相当于尺寸扩大4倍了),然后再反卷积一下子扩大8倍至原始尺寸,这会导致信息损失的。。。(还有的是,防止缩小32倍后的特征图太小,会首先对输入图像padding很多0,扩大尺寸。这显然加进去了很多噪声啊。。。)所以为了避免以上损失,deeplab的结构是:pooling3次而已,尺寸缩小了8倍。但是接着问题又来了,pooling少了,感受野变小了(这个下面就有解释说啦~),所以,deeplab通过使用带孔卷积来保证感受野。具体原理,往下看:
pooling为什么可以提高感受野?
得这样理解:首先它第一个作用是降低feature map的尺寸,减少需要训练的参数;其次,因为有缩小的作用,所以之前的4个像素点,现在压缩成1个。那么,相当于我透过这1个点,就可以看到前面的4个点,这不就是把当前map的感受野一下子放大了嘛(我是这样理解的a。。。)。
所以就有以下结论:pooling降维减少参数量,并且增大感受野。
但是,在图像分割问题中,如fcn8s,pooling5次,降低32倍尺寸,然后结合前两层的信息(扩大4倍),再一下子扩大8倍(用resize),这会导致信息损失的。
因此,提出了dilated conv带孔卷积,解决保持感受野和保护图像尺寸间的互斥问题。
以下就来介绍dilated conv带孔卷积了:
看上面的两张图,已经说的蛮清楚了。。需要好好理解的地方是:带孔卷积并不是卷积核里带孔,而是在卷积的时候,跳着的去卷积map(比如dilated=2的孔卷积,就是隔一个像素点,“卷”一下,这就相当于把卷积核给放大了(3x3的核变成7x7的核,多出位置的weights给0就是。)这样就使得3x3的卷积核也能达到7x7卷积核的感受野(图1的(b))(因为它在原map上,确实9个点就跨越覆盖到了传统conv的49个像素点),也就扩大了感受野了,使得少一些pooling层也没关系。。。
要很明确的说一点就是:带孔卷积并不增加参数量!!!带孔卷积并不增加参数量!!!带孔卷积并不增加参数量!!! 对,3x3的依然是9个weights,它即使被“扩大”了,但是那些多出的点给的权值直接是0,是不需要被训练的。。。所以,它在提高感受野的同时还不增加参数量的负担,很不错了算是。。。。。。。。。。。。
也许你会说,那些weights给0的点的信息没卷到啊,,,,这个不用担心。设置好stride,慢慢一步步的滑过图像,这些之前weights被置0的点会在某个下一次的卷积操作中被卷到的。。。我关心的感受野,只是我这一次卷积得到的这个点,覆盖了原map中多少个像素点。。。嗯,我是这么理解的。
放我以前博文的一张手稿:http://blog.csdn.net/jiachen0212/article/details/78255074
当时其实没太理解,现在才有点清楚这到底是怎么操作的了。。。rate=4时候,隔3个像素点卷积计算一次(因为中间的这被隔的三个点对应到核里面去,weights值是0的,就相当于没对他们计算操作。。。)
再记一下deconv 和 dilated conv 的区别:(我基本是把知乎的内容照搬过来的。。。)
这里重点理解反卷积deconv和普通卷积的stride> 1 可以增大感受野这两个概念:
首先deconv,stride<1,上面的栗子是0.5,那么如果是0.25,则是每两个像素间padding3个0像素值,然后再stride=1的去卷积,使得结果图像尺寸扩大4倍。
普通卷积stride>1提高感受野的话,给一张图就很清楚了。。。:
嗯,应该比较清楚了。。。
关于aspp结构后的“相加”层:eltwise层
有新的理解会来补充,欢迎大家指正!