卷积神经网络之(稠密连接网络)DenseNet

卷积神经网络之(稠密连接网络)DenseNet

ResNet中的跨层连接引申出了无数后续工作,DenseNet就是其中之一。

结构

下图所示,ResNet(左)与DenseNet(右)在跨层连接上的主要区别:使用相加和使用连结

上面右图表示B的输出在通道维上连接,A的output直接传入B后面的层。

A直接与B后面的所有层连接在一起,所以叫稠密连接。

DenseNet的优点:

  • 网络每层的计算量减少
  • 特征的重复利用

第L层的输入直接影响到之后的所有层

第L层的output:X_{L}=H_{L}([x_{0},x_{1},...,x_{L-1}])

其中[x_{0},x_{1},...,x_{L-1}]是L层之前的feature map以通道的维度合并,每一层都包含之前所有层的输出信息,因此每一层只需要很少的特征图,而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。

梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。

代码

在在conv_block函数里实现“批量归一化、激活和卷积“结构。

import d2lzh as d2l
from mxnet import gluon, init, nd
from mxnet.gluon import nn

def conv_block(num_channels):
    blk = nn.Sequential()
    blk.add(nn.BatchNorm(), nn.Activation('relu'),
            nn.Conv2D(num_channels, kernel_size=3, padding=1))
    return blk

 

稠密块由多个conv_block组成,每块使用相同的输出通道数。但在前向计算时,我们将每块的输入和输出在通道维上连结。

class DenseBlock(nn.Block):
    def __init__(self, num_convs, num_channels, **kwargs):
        super(DenseBlock, self).__init__(**kwargs)
        self.net = nn.Sequential()
        for _ in range(num_convs):
            self.net.add(conv_block(num_channels))

    def forward(self, X):
        for blk in self.net:
            Y = blk(X)
            X = nd.concat(X, Y, dim=1)  # 在通道维上将输入和输出连结
        return X

参考资料:

DenseNet算法详解

<<动手学深度学习>>

其他经典网络结构:

卷积神经网络之 LeNet卷积神经网络之(稠密连接网络)DenseNet

卷积神经网络之(深度卷积神经网络)AlexNet

卷积神经网络之(使用重复元素的网络)VGG

卷积神经网络之残差网络ResNet详解

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值