DPN 网络结构详解

DPN论文:https://arxiv.org/abs/1707.01629 

keras框架代码:https://github.com/titu1994/Keras-DualPathNetworks

Caffe框架代码:https://github.com/soeaver/caffe-model

MXNet框架代码:https://github.com/miraclewkf/DPN

pytorch框架代码:https://github.com/rwightman/pytorch-dpn-pretrained

本文主要侧重于Dual Path Network(DPN)网络结构的理解,针对cnn基础不好的小白,内容略显啰嗦,无用章节可自行略过,对于该网络的实验结果对比部分请阅读论文或参考其他博文。DPN网络是ResNeXt与DenseNet的合体,其中也会涉及到ResNet,ResNeXt,DenseNet等网络的主要结构。

一、前言

DPN在图片分类领域效果显著,主要是融合了ResNeXt与DenseNet的优点,论文中对于三者的框架对比如下:

二、ResNet、ResNeXt 和 DenseNet

1. ResNet

ResNet是著名的残差网络,公式为 y=F(x)+x,x代表的就是下图中左边的竖框,也就是网络输入,它的粗细实际上就是通道宽度;F(x)代表下图中右边的卷积操作,对于二者的结果进行相加 (如果分不清相加与合并concat,请看本章节最后)。下图只是ResNet的一个block,当很多很多block串联在一起后就变成ResNet网络了。

有两个小问题:1. x经过卷积操作后维度与原始x不同怎么办? 2. 为什么要有残差?
对于问题1,可将x进行维度转变,也就是以上公式变为y=F(x)+wx;
对于问题2,我们在求解网络时一般会用梯度下降法,但网络不断加深后,会出现梯度弥散或梯度爆炸的情况,而在F(x)上加上x后就不会出现这样的问题了。

2. ResNeXt

ResNeXt 论文链接:https://arxiv.org/abs/1611.05431

ResNeXt 是ResNet 的变种,其实就是在ResNet 的block 中,由一条残差路径变成了多条残差路径。下图是两个网络的一个block,左边是ResNet,右边是ResNeXt,可以看出,右边是将一条路径分成了32条(即32 groups),对这些路径进行卷积操作,最后相加在一起。两者的通道数是不变的。当然,这只是ResNeXt 的一种网络格式,其他格式可见论文。

3. DenseNet

 DenseNet 论文链接:https://arxiv.org/pdf/1608.06993.pdf 

很多人说DenseNet是ResNet的一个变体,个人感觉两者的差别还是很大的。DenseNet如下面最左边的图。该图中,左边的竖条即为输入,注意不是全部输入,是选取部分通道进行卷积操作,之后x与F(x)进行通道合并(concat),之后,将遗留下的通道中的一组通道(图中右边橙色的线)与上面合并后的结果进行相加操作,继续卷积、合并。DenseNet可结合右面两图理解,最左边的图片即为中间图中左边起第二、第三球附近的操作,后面球的操作可以以此类推,中间图代表一个block,当多个block串联在一起时,就成了整个DenseNet网络,即最右边的图。

ResNet 是通过输入x (或上一个block输出的x) 与残差进行相加,从而避免梯度消失或爆炸的;而DenseNet 则是通过通道的合并避免以上问题,与此同时,每次合并后都在增加特征的数量。

                                                            

4. ResNet 与DenseNet 中的相加与concat

以上网络中的等位相加与concat 对于小白来说比较容易混淆,所以特举出例子来说明下,有点啰嗦。

ResNet与DenseNet中涉及了大量的相加和合并(concat)操作,前者是对应位置上进行求和,最终不会改变通道数量的;而后者是通道合并,也就是说值不变,直接堆砌在一起。两者区别见下图,以3*3*3的样本为例,通道为3,相加后通道还为3,但数值改变,而合并后,值未变,通道数变成了6。

三、DPN

DPN实际是ResNeXt 和DenseNet 的合体,在图d中,左边为DenseNet,右边为ResNeXt (看上去更像ResNet,但实际是经过group操作的)。在图d中,左右两边进行相加操作,然后进行3*3卷积,1*1维度变换,然后进行通道分裂,左边与左边的原输入进行合并操作,右边与右边的原输入进行相加操作,如此,就形成了一个block。(原输入可以是一开始进入网络的输入,也可以是上一个阶段的输入。)

右图为DPN-92,首先,经过7*7的卷积,之后是3*3最大池化,之后就进入左图所示的操作了,[ ] 中就代表一个block,*3表示循环3个该模样的block,G 指的是ResNeXt 的一个block 中分了多少条路径(即group 数目),+16 表示DenseNet 的一个block 中每次增加的通道数(也就是左图中左边的竖条向下走时,每次多出来的宽度)。经过conv3,conv4,conv5,最后softmax 进行多分类。

        

四、总结

想要更好的理解模型,阅读实现网络的代码也是不错的方式,在本文最上面就列出了应用不同框架实现的DPN代码,可选择熟悉的一种下载。当然,上面代码的应用场景一般对图片大小有限制,如果你想去预测自己的数据集,要仔细阅读代码,看自己的数据集是否符合要求,或者相应的修改下网络,也比较简单。

猜你喜欢

转载自blog.csdn.net/qq_14811559/article/details/85009022