DenseNet
简介
作者发现(Deep networks with stochastic depth)通过类似Dropout的方法随机扔掉一些层,能够提高ResNet的泛化能力。于是设计了DenseNet。
DenseNet 将ResNet的residual connection 发挥到了极致,它做了两个重要的设计,一是网络的每一层都直接与其前面层相连,实现特征的重复利用,第二是网络的每一层都很窄,达到降低冗余性的目的。
DenseNet很容易训练,但是它有很多数据需要重复使用,因此显存占用很大。不过现在的更新版本,已经通过用时间换空间的方法,将DenseLayer(Contact-BN-Relu_Conv)中部分数据使用完就释放,而在需要的时候重新计算。这样增加少部分计算量,节约大量内存空间。,
基本信息
paper: Gao Huang,Zhuang Liu, et al. DenseNet:2016,Densely Connected Convolutional Networks
pdf:https://arxiv.org/pdf/1608.06993.pdf
CVPR 2017 Best Paper
翻译: https://aiqianji.com/blog/article/56
网络结构
DenseNet 网络如图:
上图是dense block ,下图是DenseNet结构图,其中包含了3个dense block。每个dense block内的feature map的size是一致的。
!
DenseNet的公式。[x0,x1,…,xl-1]表示将0到l-1层的输出feature map做concatenation。Hl包括BN-ReLU-Conv。
densenet网络结构如下表:
用不同节点表示如图:
[大图](https://raw.githubusercontent.com/weslynn/graphic-deep-neural-network/master/modelpic/densenet.png)
很多人看了上面论文中的图,自然会觉得网络结构一定实现很复杂,再看节点表示图,会不会觉得有种画错了的感觉。 看上去怎么就像ResNet一样简单。
是的,它的代码很简单,但是每一层和之前层的连接,ResNet是sum 而 DenseNet 是contact。
好好思考一下吧。
源码
torch https://github.com/liuzhuang13/DenseNet
pytorch https://github.com/gpleiss/efficient_densenet_pytorch