概述
在ResNet之后,骨干网络的结构有两种趋势,一种是更深,另一种是更宽。
而DenseNet则不是,它在ResNet的short-path的基础上提出了一种稠密卷积的思想,进一步缓解了梯度消失的问题,加强了特征提取、特征重用的效果,并且显著减少了参数量,同时最终模型的尺寸也比较小。
在每一个稠密卷积块中,它的输入是前面所有层的输出进行concat之后的结果,它的输出同样会作用到后面的所有层。这样一来,信息或者梯度的流通就非常通畅了,一方面使得网络更容易训练,另一方面也使得网络达到非常好的特征提取的作用。
下图是一个dense block模块,层数是5,网络增长率是4,也就是每层的输出通道数是4。
其中有两点,第一点
是稠密卷积块中的特征融合采用的是concat的方式而ResNet采用的是相加的方式。传统的前馈神经网络的结构可以看成是有状态的算法,每一层从其前一层读取状态并写入下一层,这个过程会改变状态,但也传递了需要保留的信息,ResNet使用的恒等映射则使这种信息的表示更加明确了,但是会阻碍网络的信息流。所以DenseNet使用concat的方式,进一步区分了添加到网络的信息和保留的信息,并且不阻碍信息流;第二点
是同ResNet类似,由于众多的short-path,使得网络不需要学习原有的映射,转而在已知信息上的偏移就可以了,使得网络能够更好的训练起来。(作者的观点是使得梯度的流动更加通畅)并且DenseNet具有一部分正则化的效果。第三点
DenseNet看着复杂,但是参数量相对而言会少很多哟。因为如下图所示:
细节
网络结构
以DenseNet用于图片分类为例,主要包括核心的dense blocks和dense blocks之间的transition layers,
dense blocks
如果我们把输入图片记为
x
0
x_0
x0,第
l
l
l层的输出是
x
l
x_{l}
xl,每一个稠密卷积块经过的变换记为
H
l
(
)
H_{l}()
Hl(),这里的
l
l
l是层数。
那么传统的前馈神经网络就是
x
l
=
H
l
(
x
l
−
1
)
x_{l}=H_{l}(x_{l-1})
xl=Hl(xl−1),ResNet是
x
l
=
H
l
(
x
l
−
1
)
+
x
l
−
1
x_{l}=H_{l}(x_{l-1})+x_{l-1}
xl=Hl(xl−1)+xl−1,而DenseNet就是
x
l
=
H
l
(
[
x
0
,
x
1
,
,
,
x
l
−
1
]
)
x_{l}=H_{l}([x_{0},x_{1},,,x_{l-1}])
xl=Hl([x0,x1,,,xl−1])这里的
[
]
[]
[]代表concat操作。
这个
H
l
(
)
H_{l}()
Hl()在基础版本中是BN+ReLu+3x3卷积,
而在DenseNet-B中则是BN+ReLu+1x1卷积+BN+ReLu+3x3卷积,并且1x1卷积的输出通道是4k;
transition layers
当前部分包括BN+1x1卷积+2x2的平均池化。这里的1x1在最初的的DenseNet中是不改变通道数的,而在DenseNet-BC中则是会改变的,DenseNet-BC是在DenseNet-B的基础上加入了这个压缩的操作。假设dense block的输出通道是
m
m
m,经过 transition layers之后变为
θ
m
\theta m
θm,这个
θ
\theta
θ也称为压缩因子。
这个部分主要是为了减少计算量,毕竟要是没有这一环节的话,尺寸是不会变化的,并且输入数据的通道数会很多很多,以为图片的通道数为
k
0
k_0
k0,每个稠密卷积块的输出为
k
k
k那么第
l
l
l层的输入通道数就是
k
0
+
k
∗
(
k
−
1
)
k_{0}+k*(k-1)
k0+k∗(k−1),
l
l
l很大的话,做3x3的卷积是计算量很大的。然后看这个式子我么能发现,通道数是和
k
k
k成正相关的,因此我们又把
k
k
k称为增长率,这是个超参数。
总结
三个版本的DenseNet
原始DenseNet:
Dense Block模块:BN+Relu+Conv(3*3)
transition layer模块:BN+Relu+Conv(11)(filternum:m)+dropout+Pooling(22)
DenseNet-B:
Dense Block模块:BN+Relu+Conv(11)(filternum:4K)+BN+Relu+Conv(33)
transition layer模块:BN+Relu+Conv(11)(filternum:m)+Pooling(22)
DenseNet-BC:
Dense Block模块:BN+Relu+Conv(11)(filternum:4K)+BN+Relu+Conv(33)
transition layer模块:BN+Relu+Conv(11)(filternum:θm,其中0<θ<1,文章取θ=0.5)+Pooling(22)
其中,DenseNet-B在原始DenseNet的基础上,在Dense Block模块中加入了1*1卷积,使得将每一个layer输入的feature map都降为到4k的维度,大大的减少了计算量。
DenseNet-BC在DenseNet-B的基础上,在transitionlayer模块中加入了压缩率θ参数,论文中将θ设置为0.5,这样通过1*1卷积,将上一个Dense Block模块的输出feature map维度减少一半。