您的位置:

深度剪枝的全局压缩:DenseNet

一、DenseNet概览

DenseNet是对原本Convolution神经网络模型的一种改进。它通过增加Direct Connection实现了网络的全连接,从而让前一层的输出作为后一层的输入,直接将更多的梯度和网络层之间的信息进行传递、共享,使得堆叠的层包含多种信息进行下一层特征的选择。因此,相比于传统的Convolution Network,DenseNet在预测过程中,会引用其中更多的特征图,从而解决了传统网络退化的问题,得到了更好的精度表现。

二、DenseNet网络层详解

在传统的Convolution Network中,前一层输出的梯度无法在网络的后续部分进行共享,只能被相邻的层利用,这种结构在网络中会造成消散现象和梯度爆炸的问题。为了避免这种缺失,DenseNet在网络中增加了直接连接(或称残差连接),即在每一层的输出层添加前一层的输出(即直接将前面层的特征矩阵拼接到后面层的特征矩阵中)。如图1所示,传统的Convolution Network是将前一层的输出与后面的层输入进行矩阵卷积进行网络连接;而DenseNet是将前一层的输出直接连接到后面的层输入中,产生共享的稠密连接。这种结构可以在前层和后层的输出中共享信号和梯度,这样从而使得网络的性能有所提高,特别是在小规模数据上的分类烤箱。

图1传统卷积网络和DenseNet

三、Destination of DenseNet

相对于Inception系列、ResNet,DenseNet实现更加简单,而且有着更好的特性。其最主要的特性是网络中的数据传递是在所有层之间跳跃,而不是仅在相邻层之间传递,这使得后一个层能够使用之前层的所有输出。由于所有的层对输出进行连接,因此称为Dense connection。DenseNet的目标就是实现更快的训练和更高的准确率,同时它也能减轻依赖抗线性附加部分的压力,使能让每一层输出一部分更加多元化的特征卷积核,从而提升特征可用性,去除特征重复。

四、DenseNet 模型的构建

DenseNet可以以它阶段中每个卷积层作为开始,它的基本单位是即含有3个层的卷积、BN、ReLU块(Conv-BN-ReLU)。他们组成了DenseNet 模型中的基本单元,每个单元又被一些具有相同输出通道数的单元所组成,从而形成了Dense block,然后Dense block 之后再接一个 空间变换块(即 transition layer),该层上有一个 1\*1 卷积层用于将输出通道数减半,并使用 stride = 2 的平均池化操作减小了输入数据的空间尺寸。训练过程中,为了防止过拟合,还采用了 dropout 技术对 Dense block中的 Conv-BN-ReLU层中的 BN-ReLU层进行训练。

# DenseNet model construction
def get_model(input_shape, num_classes):
    input_image = Input(input_shape)
    x = Conv2D(64, (3, 3), padding='same')(input_image)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    x = Dense_Block(x, 32)
    x = Transition(x, 128)
    x = Dense_Block(x, 32)
    x = Transition(x, 256)
    x = Dense_Block(x, 32)
    x = Transition(x, 512)
    x = Dense_Block(x, 32)
    x = GlobalAveragePooling2D()(x)
    x = Dense(num_classes, activation='softmax')(x)
    model = Model(inputs=input_image, outputs=x, name='densenet')
    return model

五、DenseNet 网络结构

DenseNet主要由三个部分组成:多个Dense Block,Transition Layer和全局池化和分类器。

*1、Dense Block*

每个Dense Block包含相同数量的稠密连接网络结构,可以使用L个稠密块为例。每个稠密块都应该有相同数量的卷积层C(k),该卷积层可以使用较小的3*3大小进行设置,因为它已经具有输入图像的所有信息才能执行下一步操作。也可以在每个连接后添加BN-ReLU,以保证稠密模型是分别应用于每个卷积层的组。每个卷积层的输出都被馈送到后面的所有层,从而实现了稠密的连接。

*2、Transition Layer*

紧接Dense Block之后是转换层或过渡层,以降低稠密连接卷积层中的特征图的数量,也就是收缩图。它通过包含1×1卷积层和平均池层来实现上述操作。 1×1卷积用于减少此类减少,以避免过度降低空间分辨率,一般将特征图减半。 平均池层的作用是对每个特征映射进行下采样并减少其数量。这些层也让模型更加紧凑,减少其参数的数量。

*3、Global Average Pooling 和分类器*

通过使用10个稠密块和一个全局平均池层,DenseNet可以保留有用信息并削减参数数量。然后将结果输入分类器,而一个单一的全连接层用于分类。

六、DenseNet和ResNet的对比

与ResNet通过保留先前层的参数来操作,DenseNet从上文中讨论的密集层中受益。这些层使网络在每一层中添加所有已计算特征。 这种方法非常适用于具有具体信息的分支。 另一方面,ResNet的重点是新特征的集成。这两种方法都可以提高结果。 虽然DenseNet通过添加直接连接来创建非常深的神经网络,但ResNet是第一个可以成功进行100层层次堆叠的模型之一。

七、为什么性能会优于ResNet

a、DenseNet可以显著提高网络的伸缩性,在保留网络中的极少量参数的同时实现更高的准确性。众所周知,高维数据集可以在非常少的网络深度下实现准确度的高精度分类。主要原因是高维空间中相对于输入的冗余信息,这在两个随机输入数据中是共享的。整个DenseNet网络结构的设计主要目的是为模型加入更多的共享参数,其中这些参数由高维数据决定。如此设计网络,在长时间训练中就可以训练出高相关性和高冗余性特征的模型。

b、ResNet是在卷积神经网络中的一个重要进展,因为它可以帮助我们深度堆叠层,并减轻在训练过程中出现梯度消失问题。但是当层数越来越深时,存在一些不利的定性性质(当违反i.i.d偏差时)。因此,为了在保持高精度的同时解决这些问题,DenseNet通过Concatenation 和非线性变量的引入,来帮助降低和减轻定性偏差的影响从而提高结果。

八、DenseNet网络选取

DenseNet超参数遵循ResNet的一般套路,由于DenseNet中包含更多的连接,因此它需要更少的层数。这样就不仅可以避免网络的过拟合问题,同时也可以更好地保证网络稳定性,提高学习性能。一系列DenseNet模型已经在ImageNet、CIFAR、COCO、PASCAL VOC等竞赛中展示出了比其他流行模型更高的精度(见表1)。其中最有代表性的DenseNet则是由121层、169层、201层和265层组成的4个模型。

Table 1: DenseNet在不同数据上的表现