DenseNet

作者: 妖皇裂天 | 来源:发表于2018-12-17 21:13 被阅读0次

  DenseNet对应的论文是Densely Connected Convolutional Networks
  DenseNet由多个dense block组成,每个dense block中的每一层都和其他所有层连接起来。对于每一层而言,它前面所有层的输出都是该层的输入,而它的输出又是后面每一层的输入。具体形式如下图(从原论文上截取下来的):

Dense Block.png
这样设计的优势在于:
  1. 减缓了梯度消失问题,深层梯度可以直接传回浅层;
  2. 加强了特征的传播,浅层特征可以直接传到深层中使用;
  3. 鼓励特征的reuse,每一层输出的特征都被其后面的层所使用;
  4. 减少了模型的参数,减少了贡献不大的中间卷积层。

  Dense Net中也可以看做包含大量的short cut,但是它这种short cut和ResNet中的short cut是不同的,DenseNet中不同层的特征连接方式是concat,而ResNet中不同层的特征连接方式是sum。也即:
\begin{align} DenseNet: \quad & X_l = H_l(X_{l-1})+X_{l-1} \\ ResNet: \quad & X_l = H_l([X_0,X_1,...,X_{l-1}]) \end{align}  一个dense block中包含多个dense layer,而dense layer中包含3层:BNReLUConv(注意这里BN是在激活函数ReLU之前,我的理解是为了调整数据的分布,因为每一层的输入都是之前所有层的输出,不同层的输出一般其分布也不同,为了使得该层能更快更好地学习,那么先将输入信息进行规范化是很有必要的)。完整的dense layer流程是:
BN \rightarrow ReLU \rightarrow 1*1Conv \rightarrow BN \rightarrow ReLU \rightarrow 3*3Conv前3层作为一个部分是为了利用1*1Conv减少特征图数量,增加计算量。不同dense block之间的连接层称为transition layer,每个transition layer包含3层:BN1*1Conv2*2AvgPool。Transition layer的作用我认为是为了给feature map降低size作用,这里存疑。
  对于每个dense layer而言,它的输入是前面所有层的输出,它的输出又是后面所有层的输入,如果不加限制,那么Dense Net中每层特征图的数量就会呈指数上升。针对这个问题,论文中提出了一个重要的参数Ground rate,这个参数指明了每个dense layer输出的channel数。所以一个包含L层的dense block中第l层输入channel数是k_0+k*(l-1),其中k_0表示dense block的输入channel数。也就是说一个dense block中每一个dense layer的输入channel数在不断增加,而输出channel数是不变的,最后dense block的输出是所有dense layer的输出的拼接,channel数为k*L
  为了更好地了解DenseNet的原理,我看了下PyTorch中DenseNet的实现,包括:

# dense layer的实现
def _bn_function_factory(norm, relu, conv):
    def bn_function(*inputs):
        # dense layer中输入的拼接和前3层是确定的,所以用一个工厂函数进行封装
        # 后3层需要定制,所以就不写在工厂函数中
        concated_features = torch.cat(inputs, 1)  # 输入信息的拼接,inputs是一个list
        bottleneck_output = conv(relu(norm(concated_features)))
        return bottleneck_output
    return bn_function
# dense block类中forward函数的实现
def forward(self, init_features):
    features = [init_features]  # 维护一个全局变量(features,以list形式)来依次保存各层的输出
    for name, layer in self.named_children():
        new_features = layer(*features)
        features.append(new_features)  # 依次向features中添加各层的输出
    return torch.cat(features, 1)  # dense block的输出是该block中每个dense layer的输出的拼接结果

相关文章

  • DenseNet

    减轻了梯度消失 加强了feature传递 更有效的利用了feature 减少了参数数量 解决的问题还是:随着网络的...

  • DenseNet

  • DenseNet

    Densely Connected Convolutional Networks 这篇博客转载自原文链接 前言 在...

  • DenseNet

      DenseNet对应的论文是Densely Connected Convolutional Networks。...

  • DenseNet

    论文:https://arxiv.org/pdf/1608.06993.pdf[https://arxiv.org...

  • DenseNet与其他网络的对比图

    34层残差网络 残差网内部如下: DenseNet如下 DenseNet的主体框架(在每个Dense Block内...

  • DenseNet阅读笔记

    DenseNet是继ResNet之后提出的一种局部直连的网络。 DenseNet的优点可以总结为1)有效减轻梯度弥...

  • Models for CNN

    ResNet PreActResNet WildNet ResNeXT DenseNet Mobile Net

  • Pytorch DenseNet Fashion-Mnist

    pytorch 实现 DenseNet on Fashion-MNIST 运行过程

  • DenseNet详解

    一、概述 作为CVPR2017年的Best Paper, DenseNet 脱离了加深网络层数(ResNet)和加...

网友评论

      本文标题:DenseNet

      本文链接:https://www.haomeiwen.com/subject/poackqtx.html