DenseNet学习笔记
1.简介
1.1.结构图
ResNet通过添加shortcut的方式,能够很好地解决梯度消失的问题,使得神经网络的深度可以进一步提升。ResNet只在相关两三层添加shortcut,而DenseNet则像是ResNet的极端版本,它在所有层之间都添加shortcut(类似于无向完全图),即当前层的输入由前面所有层的输出堆叠组成。
1.2.特点
(1)缓解了梯度消失的问题:因为能够顺着shortcut为很前面的层提供梯度。
(2)加强了特征的传播以及重用:因为当前层输出的特征图被作为后续所有层的直接输入之一。
(3)参数少:与Alexnet、VGG这些网络相比,DenseNet需要的通道数比较少,好像12就够了,相比VGG这些64、128等等。
2.Dense Block
2.1.为何要分块?
对于某一层,它的输入由前面所有层输出的特征图堆叠起来构成,能够把前面层的输出堆叠在一起的前提是:所有特征图是size的一样。假如不一样,可以通过padding解决。但这么多不同size的通道进行padding,恐怕增加了复杂度。
假如引入block,在block内全连接,在block之间则单连接,bloch之内的特征图的size不变,而在block之间的交界处,通过pooling改变特征图的大下,然后再输入到下一个通道。这样就能够解决特征图size对齐的问题了。
2.2.block的外部接口
(1)输入:上一个block输出的特征图经过卷积、池化后的特征图。(卷积是1*1卷积,用来改变通道数,池化是2*2、stride=2的平均池化,用来改变特征图的size)
(2)输出:k个特征图。(这里的k是一个参数,代表所有层操作输出的通道数,即所有层输出的通道数都是一样的,都是k,但输入的通道数则不一样。进一步地,所有block的输出通道都是k,但输入通道则不同,由在前面交界处1*1卷积设定的通道数决定。)
2.3.block的内部结构
一个block里面有若干个节点(有多少个论文似乎没说,而且每个block里面的节点个数是否是一样也没说,推测应该是一样的)。对于每个节点,它由3个操作组成,依次是Batch Normalization、ReLu、Conv,其中Conv的kernel_size=3,stride=padding=1,故可保持输入和输出特征图的size不变。小优化:由于节点输入来自block内前面节点输出的特征图,所以通道数算是比较多的了,为此可以在前面先进行降维,那就是引入1*1的Conv,那当然还要加入BN和ReLu了(在Conv之前加BN、ReLu似乎是约定俗成了),故最终一个节点依次由以下操作组成:BN-Relu-1*1Conv-BN-Relu-3*3Conv。
所有输出的特征图个数都是k,即通道数都是k,论文提到设置为12就够了。这里的k是个全局参数,即整个网络所有层的输出都是k个特征图,并非每个block的k都不同。
每个节点的输入由所在block内该节点前面所有节点输出的特征图堆叠而成,因整个block内输出的特征图size是相同的,故可直接堆叠。
2.4.block之间交汇处
在两个block交汇处,有两个操作构成,依次是1*1的Conv、stride=2的2*2avg pool。1*1的Conv是1*1卷积是用来改变通道数;池化是用来改变特征图的size。
为了在block的交界处进一步提升模型的紧凑性,可以通过1*1的Conv进行降维。
posted on 2020-07-27 22:40 ZhicongHou 阅读(101) 评论(0) 编辑 收藏 举报