论文:Densely Connected Convolutional Networks
论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码的github链接:https://github.com/liuzhuang13/DenseNet
PyTorch实现链接:https://pytorch.org/docs/0.4.0/_modules/torchvision/models/densenet.html#densenet121
DenseNet的构造思路以及算法细节,参考该篇博客即可,博主已经介绍的挺好的:
https://blog.youkuaiyun.com/u014380165/article/details/75142664/
论文中,作者用两个式子,很好的解释了DenseNet与ResNet之间的本质差异:
ResNet: DenseNet:
再贴一张DenseNet的网络结构图,有助于下面理解代码:
下面直接通过源码来理解DenseNet的思想,Let's go ~!
一、Dense layer
Dense layer是一个类似bottle neck的结构,所以源码作者也称其为bottleneck layer,但有些许差别
可以看下面这张图,每两层之间都建立了一个连接。
class _DenseLayer(nn.Sequential):
def __init__(self, num_input_features, growth_rate, bn_size, drop_rate):
super(_DenseLayer, self).__init__()
# 1.Dense layer的结构参照了ResNetV2的结构,BN->ReLU->Conv
# 2.与ResNet的bottleneck稍有不同的是,此处仅做两次conv(1*1conv,3*3conv),不需要第三次1*1conv将channel拉升回去
# 由于Dense block中Tensor的channel数是随着Dense layer不断增加的
# 所以Dense layer设计的就很”窄“(channel数很小,固定为growth_rate),每层仅学习很少一部分的特征
# 3.想象一下,如果设计的和bottleneck一样