DenseNet网络

DenseNet网络的密集连接机制(其中c代表的是channel级连接操作)

传统的网络在 l 层的输出为:

对于ResNet,增加了来自上一层输入的identity函数:

在DenseNet中,会连接前面所有层作为输入:

其中,上面的 代表是非线性转化函数(non-liear transformation),它是一个组合操作,其可能包括一系列的BN(Batch Normalization),ReLU,Pooling及Conv操作。注意这里 层与 层之间可能实际上包含多个卷积层。

                               DenseNet的前向过程

DenseNet网络中使用DenseBlock+Transition的结构,使特征图大小保持一致。其中DenseBlock是包含很多层的模块,每个层的特征图大小相同,层与层之间采用密集连接方式。而Transition模块是连接两个相邻的DenseBlock,并且通过Pooling使特征图大小降低。图4给出了DenseNet的网路结构,它共包含4个DenseBlock,各个DenseBlock之间通过Transition连接在一起。

                            DenseBlock+Transition的DenseNet网络

扫描二维码关注公众号,回复: 11894109 查看本文章

网络结构

如前所示,DenseNet的网络结构主要由DenseBlock和Transition组成。下面具体介绍网络的具体实现细节。

                                        DenseNet的网络结构

在DenseBlock中,各个层的特征图大小一致,可以在channel维度上连接。DenseBlock中的非线性组合函数采用的是BN+ReLU+3x3 Conv的结构,如下图所示。另外所有DenseBlock中各个层卷积之后均输出 k 个特征图 (k个channel/k个卷积核)。 k 在DenseNet称为growth rate。假定输入层的特征图的channel数为 k0,那么 l 层输入的channel数为

由于后面层的输入会非常大,DenseBlock内部可以采用bottleneck层来减少计算量,主要是原有的结构中增加1x1 Conv,如下图所示,即BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv,称为DenseNet-B结构。其中1x1 Conv得到 4k 个特征图它起到的作用是降低特征数量,从而提升计算效率。

                       使用bottleneck层的DenseBlock结构

对于Transition层,它主要是连接两个相邻的DenseBlock,并且降低特征图大小。Transition层包括一个1x1的卷积和2x2的AvgPooling,结构为BN+ReLU+1x1 Conv+2x2 AvgPooling。另外,Transition层可以起到压缩模型的作用。假定Transition的上接DenseBlock得到的特征图channels数为m.   Transition层可以产生个特征(通过卷积层),其中。是压缩系数(compression rate)。当时,特征个数经过Transition层没有变化,即无压缩,而当压缩系数小于1时,这种结构称为DenseNet-C,文中使用。对于使用bottleneck层的DenseBlock结构和压缩系数小于1的Transition组合结构称为DenseNet-BC。

使用Pytorch实现DenseNet: https://zhuanlan.zhihu.com/p/37189203

猜你喜欢

转载自blog.csdn.net/jialibang/article/details/108012614