DenseNet
在学习论文Fully Convolutional DenseNets for Polyp Segmentation in Colonoscopy时对Densenet进行一些总结:
ResNet与DenseNet的区别:
-
相比ResNet,DenseNet提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入
-
ResNet是每个层与前面的某层(一般是2~3层)短路连接在一起,连接方式是通过元素级相加(element-wise addition);而在DenseNet中,每个层都会与前面所有层在channel维度上连接(concat)在一起(channel-wise concatetation)
-
对于一个L层网络,DenseNet共包含L(L+1)/2个连接,相比ResNet来说,这是一个密集连接,而且DenseNet是直接concat来自不同层的特征图,这可以实现特征重用(feature reuse),减少计算,提高效率,这点是两者主要的区别
- ResNet
- DenseNet
-
公式表示:
ResNet: 增加了来自上一层输入的identity函数
x l = H l ( x l − 1 ) x_l = H_l(x_l-1) xl=Hl(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])
其中,上面的 H(代表是非线性转化函数(non-liear transformation),它是一个组合操作,其可能包括一系列的BN(Batch Normalization),RELU,Pooling以及Conv操作。
CNN网络一般要经过Pooling或者stride>1的Conv来降低特征图的大小,而DenseNet的密集连接方式需要特征图大小保持一致。为了解决这个问题,DenseNet网络中使用DenseBlock+Transition的结构,其中DenseBlock是包含很多层的模块,每个层的特征图大小相同,层与层之间采用密集连接方式。而Transition模块是连接两个相邻的DenseBlock,并且通过Pooling使特征图大小降低。
在DenseBlock中,各个层的特征图大小一致,可以在channel维度上连接。DenseBlock中的非线性组合函数 H 采用的是BN+ReLU+3x3 Conv的结构。与ResNet不同,所有DenseBlock中各个层卷积之后均输出 K 个特征图,即得到的特征图的channel数为 K ,或者说采用 K 个卷积核。k在DenseNet网络中称为growth rate,是一个超参数.在上面提到的论文中k=12,可得到较好的性能。假定输入层的特征图的channel数为X0,那么第n层输入的channel数为X0+(n-1)*k
由于后面层的输入会非常大,DenseBlock内部可以采用bottleneck层来减少计算量,主要是原有的结构中增加1x1 Conv,即BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv,称为DenseNet-B结构。其中1x1 Conv得到 4K 个特征图它起到的作用是降低特征数量,从而提升计算效率。
对于Transition层,它主要是连接两个相邻的DenseBlock,并且降低特征图大小。Transition层包括一个1x1的卷积和2x2的AvgPooling,结构为BN+ReLU+1x1 Conv+2x2 AvgPooling。另外,Transition层可以起到压缩模型的作用。假定Transition的上接DenseBlock得到的特征图channels数为 m ,Transition层可以产生 [θ m] 个特征(通过卷积层),其中 θ在0-1之间, 是压缩系数(compression rate)。当 θ=1 时,特征个数经过Transition层没有变化,即无压缩,而当压缩系数小于1时,这种结构称为DenseNet-C.对于使用bottleneck层的DenseBlock结构和压缩系数小于1的Transition组合结构称为DenseNet-BC
在本篇论文中介绍了将pruned densenet和 traditional densenet 构造全卷积网络
TDB:
PDB:
如果使用TDB, feature map的数量会随着分辨率的增大而快速增长。如果使用PDB, feature map的数量会随着分辨率的增大而缓慢增长。
两者构造的全卷积网络:
在每次TDB后加入了Skip方法,弥补了在卷积过程中的损失,从而得到相同分辨率的feature map
层数不同,分割效果不同,当n=6时,分割效果最好