- 和ResNet的区别:ResNet是求和,而DenseNet是做一个拼接。**每一层网络的输入为:当前输入+前面所有层网络的输出。**第L层的输入等于K x (L-1) + k0,其中k是生长率,表示每一层的通道数。
- 提升信息和梯度在网络中的传输效率:每层都能直接从损失函数拿到梯度,并且直接得到输入信号。目的:训练更深的网络,有正则化的效果。
- 其他网络致力于从深度和宽度来提升网络性能,而DenseNet从特征重用的角度来提升网络性能
细节:
- 一个完整的dense net,包括3个dense block。
- 在block之间没有dense连接,因为在pooling操作之后,改变了feature maps的大小,这时候就没法做dense 连接了。
- 在两个block之间的是transition layer ,包括了conv ,pool。(在实验中使用的是1个BN、1个1x1卷积和一个2x2 avg pool)目的:降低冗余。缓解梯度消失,省参数省计算,特征重用可以抗过拟合。达到相同的精度,dense net只需要res net一半的参数和一半的计算量。
- 密集连接会使网络显得比较冗余,所以DenseNet将每一层都设计的特别窄,Dense Block中的每个单元都是一个bottleneck layer,其中包括一个 1x1 卷积和一个3x3卷积。
- 1个block中有m个feature maps,通过一个0-1之间的参数来限制输出的feature maps数量。m -> theata x m。目的:降低参数量(GoogleNet也是用这种方式)
- 问题: DenseNet的内存主要耗费在拼接过程,每次拼接都会开辟新的内存空间。**解决:**使用共享内存。
- 问题: forward和backward的内存依赖,粉红色是forward,深红色是backward。Forward的时候内存不能释放,backward的时候可以。forward依赖backword。**解决:**保留forward或在计算backword的时候重新计算forward。后者会多耗费15%的时间,但节省70%的空间。
https://blog.csdn.net/bryan__/article/details/77337109