关于Densenet的实验🧪

论文解读

地址:https://arxiv.org/pdf/1608.06993.pdf

近期突发奇想,重新拿起了这篇2017年的oral重新看了一下,从Googlenet到VGG-19,Incepetion等模型,到Resnet的出现,在模型中首次使用了跳层连接,输出到输入到桥梁连接起来,训练出了更深的网络模型,特征层的提取更加深入。

Densenet提出了更加有力的连接方式,就是看起来复杂度更高的密集连接,将每一个block里面的每一个层都和前面所有层连接,为了更清楚一点描述这个问题,引用一下加工过的论文原图:

image-20200311170037838

每一个多层结构,都是一个块状结构,它包含多个layers,每一个layers都会和前面的所有层,通过通道连接到一起,实现就是试用torch的torch.cat()函数,一般的输出都是通过一个激活函数(非线性)

而Densenet的输出不太一样,他是叠加了前面所有层的输出,在channnels维度上进行连接

Network 结构:

前向传播:

image-20200311173642614

image-20200311172628574

Block实现:

其中Densenet的block包含着多个结构,存在多个conv或者bn的过程,定义了一个block函数,使用一个list来储存layers,numblock就是block也就是首页图中的红框的个数,每一个红框都代表一个瓶颈层,growth_rate参数的意思是通道生长率,我们都知道,卷积核的个数,代表了数据输出维度的第三个维度,通道数是我们用来连接的维度,故为防止通道过多,设置不能过大的通道生长率有很重要的意义,剩下的参数input_channels,就是输入图像的通道数,可以看到我们在函数里,把这个设置为当前通道数,在每一次结束的时候,现在的通道数都会增加,增加的就是生长率的部分。

bottleneck实现:

首先,参数含义:

Transition Layer:

从上述结构图结构图中可以看到,每两个block之间的结构不只是直接连接输出变为输入的方式,而是通过非线性的方式,进一步整理faeture的大小,论文中把这部分称为Transition,过渡层,实现如下:

参数:

Densenet类:

实验结果🧪:

优化器和损失配置: