Dense Connected Convolutional Networks. CVPR_2017
该论文一共有5个版本,这是第一个版本
1. 了解DenseNet的设计思想
2. 了解如何优化网络结构(目标识别或者分类的难度不同,并不需要将它们都在网络的最后一层输出)
网络结构设计
1. 设计更深的网络结构
2. 设计更深网络结构出现的梯度消失/爆炸问题
每个Dense Block之间都通过transition层连接,在transition层中有一个1x1卷积和一个池化,1x1卷积的输出通道数量和输入特征数量相同。通过加transition层的方式实现池化操作。
第 l t h l^{th} lth层的输入通道数是 k × ( l − 1 ) + k 0 , k 0 k \times (l - 1) + k_0,k_0 k×(l−1)+k0,k0表示输出的通道数。为了防止网络过宽,k通常取12(L=40),24(L=100)
每一层都接收之前所有层的特征图并且把自身的特征图传给后面所有的层。
假设当前层是L,那么L层会接收1, 2, …, L - 1层所有的特征,这些特征都作为单独的输入(concat)输入到第L层中, x l = H l ( [ x 0 , x 1 , ⋯ , x l − 1 ] ) x_l = H_l([x_0, x_1, \cdots, x_{l - 1}]) xl=Hl([x0,x1,⋯,xl−1]), [ x 0 , x 1 , ⋯ , x l − 1 ] [x_0, x_1, \cdots, x_{l - 1}] [x0,x1,⋯,xl−1]表示对这些特征图进行concat
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
v1:初始版本
v2:在transition layer中加入了Batch Normalization
版本号 | 改变 |
---|---|
V1 | 1. dense connectivity 2. composite function 3. Pooling layers(transition layer) 4.Growth rate |
V2 | 1. composite function: \quad 加入bottleneck layer,即每次进行3x3卷积之前先进行1x1卷积,降维到4k个channel,记为DenseNet-B 2. transition layer: \quad 加入Batch Normalization \quad 加入compression,即输出通道数变为 [ θ m ] , θ ∈ ( 0 , 1 ] [\theta m],\theta \in (0, 1] [θm],θ∈(0,1],记为DenseNet-C,实验时 θ = 0.5 \theta = 0.5 θ=0.5 3. 加入ImageNet分类任务的结果 4. 简单讨论Stochastic Depth Networks与DenseNets之间的联系 5. 替换V1版本的heat map 6. 移除V1版本中DenseNets和Partial DenseNets的对比试验 |
V3、V4、V5 | 和V2相比没有变化 |
在100层的DenseNet网络中,k从12增加到24,在C10上的表现降低,不一定是由过拟合问题引起的。因为作者针对这点,作了另外一个实验,使用DenseNet(L=100, k=12),然后不使用Dropout,在C10和C100上的结果分别是8.85%和32.53%,几乎超过了表中所有方法(除FractalNet with dropout)。当k从12增加到24时,这种误差波动在波动范围内,所以无法判断是否是由过拟合引起。
The weight norm serves as an approximate for the dependency of a convolutional layer on its preceding layers(权重范数是卷积层在其前层上的依赖性的近似值)
图中每列表示layer,每行表示对应的特征图,每个像素点表示卷积层与特征图关联的权重的范数。
点越偏近黄色,该层越充分利用该特征图;点越偏近深蓝色,表明该层未利用该特征图。
对比DenseNet(L=100, k=24)和DenseNet-BC可以发现,随着网络深度的增加,网络的性能并没有得到提升, 这是因为SVHN是一个相对简单的任务,使用更深的网络会导致模型过拟合
DenseNet(L=100, k=12)在C10上的5.77到DenseNet(L=100, k=24)的5.83,是因为过拟合引起的,解决V1版本中该问题引起原因
版本 | (L, K) | Params | C10 | C10+ | C100 | C100+ | SVHN |
---|---|---|---|---|---|---|---|
V1 | 40, 12 | 1.0M | 7.00 | 5.24 | 27.55 | 24.42 | 1.79 |
V1 | 100, 12 | 7.0M | 5.77 | 4.10 | 23.79 | 20.20 | 1.67 |
V1 | 100, 24 | 27.2M | 5.83 | 3.74 | 23.42 | 19.25 | 1.59 |
V2 | 100, 12 | 0.8M | 5.92 | 4.51 | 24.15 | 22.27 | 1.76 |
V2 | 250, 24 | 15.3M | 5.19 | 3.62 | 19.64 | 17.60 | 1.74 |
V2 | 190, 40 | 25.6M | - | 3.46 | - | 17.18 | - |
L表示网络深度,K表示Growth Rate,不同数据集中的数据是error rate(%),数据集后面有个+表示使用data augmentation,即the images are first zero-padded with 4 pixels on each side, then randomly cropped to again, produce 32x32 images; half of the images are then horizontally mirrored
1. 特征的reuse方式
2. 网络结构的设计思想(将不同层特征直接进行重用,并且重用每一层的特征)
3. DenseNet中,网络的低层特征会流向高层并被高层充分利用
4. 该层的平均权重小,说明特征冗余。因为当有大量重复特征时,网络再使用的时候并不需要全部使用它们,而是使用它们中的一部分(有点类似与PCA),剩余的部分几乎不被使用,所以权重会相对较低,因此该层的平均权重会偏小。
DenseNet中每一层都可以和损失函数有直接"交流"(可以直接通过损失函数计算梯度,而不需要层层回传,也正是因为这点,所以避免了梯度消失和梯度爆炸)。
DenseNet每一层都很"窄"(channel数量非常少,只有12或者24),然后每层学习一些特征,每层都会接收之前所有层的特征,相当于对这些特征进行了重组,充分利用这些特征。举个不是很恰当的例子:例如猫的识别,在第一层网络中,学习了猫的毛发特征,可能是一些点或者线,然后在第二层网络中,学习了猫的一些轮廓信息,在第三层中,学习了猫的身体信息,第四层中,学习了猫的头部信息。在分类时,分类器会接收所有的这些特征,然后基于这些特征来判断是否是一个猫。ps:实际的学习过程可能并没有这么快,此处只是一个假设,用于理解该网络的设计理念
DenseNet中,网络的低层特征会流向高层并被高层充分利用,这说明低层的特征对于网络的贡献是不可忽略的。
该层的平均权重小,说明特征冗余。因为当有大量重复特征时,网络再使用的时候并不需要全部使用它们,而是使用它们中的一部分(有点类似与PCA),剩余的部分几乎不被使用,所以权重会相对较低,因此该层的平均权重会偏小。
参考博客:https://blog.csdn.net/xys430381_1/article/details/88370733