计算机系统应用教程网站

网站首页 > 技术文章 正文

空洞卷积理解:感受野以及其对分割任务的有效性

btikc 2024-08-31 17:13:27 技术文章 20 ℃ 0 评论

我们可以用这篇文章来理解一下空洞卷积在分割中的作用。

本文目录:

  1. 奇怪,为什么空洞卷积的感受野偏大?那是因为空洞卷积串行组团起来后,感受野变大很多。
  2. 论文对膨胀卷积构成的卷积模块的描述。
  3. 在不降低特征图分辨率的情况下,指数级的实现感受也增长。
  4. 论文中关于膨胀卷积的公式比较难理解,我们来挑战一下。
  5. 我们发现了一种与语义相关的更有效的初始化方式
  6. 训练
  7. 膨胀卷积意义总结
  8. 但是空洞卷积的使用时是有风险的:栅格效应



关于感受野:

奇怪,为什么空洞卷积的感受野偏大?那是因为空洞卷积串行组团起来后,感受野变大很多。

这也是空洞卷积设计的核心思路。


图b所示卷积的感受也必须与图a所示卷积的相连,它的感受野才是7x7.

同理:图c所示卷积的感受也必须跟在图b和图a卷积之后,同时,图b必须在图a之后。


论文对膨胀卷积构成的卷积模块的描述

我们的膨胀卷积模块:集成多尺度纹理信息,没有降低分辨率,不需要对图片缩小再放大。

模块可以即插即用到任意分辨率的feature map里。

不像金字塔类型的结构主要为了实现图像分类,这个结构主要是为了实现密集预测。

可以代替pooling 代替subsampling,

这个模块是基于dilated convolutions的,

在不降低特征图分辨率的情况下,指数级的实现感受也增长。

这个指数是卷积核的kernel_size

第一层用dilated=1感受野是R1=kernel_size=3

第二层用dilated=2,感受野是R2=R1* kernel_size-(kernel_size-1)*(dilated-1)

=3*3-(3-1)*(2-1)=9-2=7


第三层用dilated=4,

感受野是R3= R2*kernel_size-(kernel_size-1)*(dialted-1)

=7*3-(3-1)*(4-1)=21-2*3=15


这个指数就是kernel_size了。

设计这个膨胀卷积的时候,要注意,这个膨胀系数的设计。

大的膨胀系数虽然会使感受野增大,但是过大,会造成采样不均匀。

小的膨胀系数就使感受也增大不多了,

所以,一般,膨胀系数就设置为上一层感受野的一半左右。

dilated-1 = 向下取整(上一层感受野/2)。

所以第四层用:

dilated-1= 向下取整(15/2)=7

第四层用dilated=8,

其感受野R4 = R3*kernel_size-(kersize-1)*(dilated-1)=15*3-2*7=45-14=31


论文中关于膨胀卷积的公式比较难理解,我们来挑战一下:

F:离散函数

k = (2r+1)*(2r+1)

-2,-1,0,1,2

在位置p处的卷积输出。

注意到,卷积的名字就是来源于此,对于位置p处的值,总是由相互位置关系约束为p的速有点相关计算而得到。

p的每个点都是由输入的两个向量的所有点相关计算而得到。

以及计算不同的p的结果时,两个输入向量的位置关系依次滑动,然后点积。整个过程我们形象化得称为“卷积"

以上是标准卷积。

膨胀卷积的话,两个输入向量之间的元素不再是一一对应的关系。卷积核不再点积向量中的所有值,而是间隔性地去点积。

s和t的关系不再是s+t=p

而是s+lt=p

卷积的过程即是:

...+F(1)k((p-1)/l)+F(2)k((p-2)/l)+F(3)k((p-3)/l)+F(4)k((p-4)/l)+...

由于k是离散函数,所以, 当(p-1)/l不能整除时,含有(p-1)/l的项将不存在,这就造成F(1)将不会被卷积到。

这就是论文中公式的理解:


论文中提出的网络结构:

膨胀系数为也是指数性增长的,


这种膨胀系数的指数性增长,也就造成了每一层的感受野指数性增长:


这就是论文multi-scale context aggregation by dilated convolutions基于膨胀卷积的多尺度纹理集成里面,感受野指数性增长的意思。




我们有个基本的模块basic 也有large模块,两个模块在channel维度上不一样

这样一个模型的初始化就不能用标注的方式了,标准的初始化方式训练不好。

标注的初始化方式通常是用Glorot,Krizhevsky等的方式。

但是我们发现这种随机的初始化方式不适合我们这种情况。

我们发现了一种与语义相关的更有效的初始化方式:


公式4中,a是 输入feature map的序号,b是输出feature map的序号。

也就是说,我们使用0,1初始化。

只有少数weights 会给1,其他给0值。

我们知道kernel的维度是a*k*k*b的。

也就是说我们有a*b个k*k,

当a=b 时,我们才给这个k*k的矩阵赋予1值。

并且还不是所有的k*k都给1,

只给这个k*k的矩阵的第一个值给1.

这种初始化方法把输入feature map直接就给输出 feature map 了。直接给,是个倒爷。

这是一种一致性初始化,其实是把输入直接给输出了。

有一种说法:反向传播不能在信息直接传播时进行显著提升。

但是,实验结果证明以上说法不靠谱。

反向传播可靠的利用纹理信息提升了分割的准确率。


我们提供的基本纹理模块中,每个层的通道数是一样的。

我们也提出了一个通道数比较多,层的通道数也相对变化的Larger 模块。

这个模型由于通道数不一样,我们原来的初始化方法就不适用了。

用以下初始化方法:


这次不再给0或者1了,把1换成了C/ci+1 ,把0换成了一个随机数。

当输出通道数是输入通道数的2倍时,我们把输入featuer map的值按照平均分配给输出通道上。


训练:

网络输入一个彩色图片,输入一个21通道的feature maps.





膨胀卷积意义总结:



pooling下采样的过程造成细节损失,上采样时,这些细节无法重建。

即使用了可学习的反卷积进行上采样。

像素分类问题需要更大的感受野,

因为对像素进行分类时,需要在空间上有更大的范围的信息来做决策。

这类问题空洞卷积可以很好地解决。

但是空洞卷积的使用时是有风险的:删格效应




本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表