DenseNet:密集连接
源码、配套笔记&讲解视频,点击文末名片获取
1、研究背景和动机
(1)深度学习的发展瓶颈
在 ResNet 之前,研究者普遍认为:网络越深,性能越好。
- 但实际情况是:随着层数增加,训练会变得越来越困难,出现 梯度消失/梯度爆炸。
什么是梯度消失?
在深度网络里,训练是靠 梯度反向传播 来更新参数的。 - 如果网络很深,梯度在一层一层往回传时,会越来越小,最后前面层几乎收不到有效信号。
- 这就叫 梯度消失,结果就是:前面层“学不会”,训练停滞。
ResNet 的做法:残差连接
ResNet 给每个模块加了一条“捷径”,让梯度不用走那么多层,可以直接往前传。
- 好处:缓解了梯度消失,能训练更深的网络。
- 局限:每个残差单元只有一条“直连”,信息流还是有限的。
(2)DenseNet 的核心思想
DenseNet 更激进:每一层都和之前所有层直接相连。
- 与其让每一层都“重新学习”特征,不如直接把前面所有层的特征都传递给后续层。
- 这样可以:
- 缓解梯度消失 → 因为梯度可以通过“短路径”直接传到前面层。
- 鼓励特征复用 → 每一层都能访问到之前所有层的特征,不会浪费计算力去重复学习。
- 大幅减少参数量 → 因为不需要在每一层都学习新的特征表示。
(3)直观比喻
DenseNet 就像一个“微信群”:
- 在 ResNet 中,每个人只转发消息给下一个人(有时候附带一条快捷通道)。
- 而在 DenseNet 中,群里所有人都能看到之前所有人的消息。
- 这样一来,信息不会丢失,每个人都能在已有消息的基础上贡献新的信息。
📌 小结
DenseNet 的研究动机在于:
- 解决 深度网络训练困难(梯度消失、退化问题)。
- 提高 特征复用率,避免重复学习。
- 降低 参数冗余和计算成本。
2、DenseNet 的创新点
(1)密集连接(Dense Connectivity)
- 核心思想:每一层都会接收 之前所有层的输出 作为输入,并把自己的输出传递给之后所有层。
- 对比 ResNet:ResNet 只是在“输入 + 输出”之间做“残差相加”;而 DenseNet 是“特征拼接”,保留了所有前面层的完整信息。
- 直观比喻:ResNet 是“帮你加点捷径”;DenseNet 是“把所有前人笔记都放到桌上,你直接翻看”。
(2)高效的特征复用
- 由于所有层的特征都会被传递和复用,网络不需要在不同层反复学习相同的特征。
- 这大大减少了 参数冗余。
- 实验结果:DenseNet 在相同或更少参数的情况下,性能优于 ResNet。
(3)缓解梯度消失,训练更容易
- DenseNet 的“短路径”让梯度可以直接传递给任意前一层 → 比 ResNet 还要高效。
- 这使得网络可以 更深更稳定 地训练。
(4)更小的参数量和更高的计算效率
- 虽然连接很多,但因为每层的 输出通道数(growth rate)较小,整体参数量反而比 ResNet 更低。
- 效果:DenseNet 在准确率更高的同时,模型规模比 ResNet 小得多。
(5)更强的特征传播与正则化效果
- 特征传播更强
- 在普通 CNN 里,每一层只看到“上一层”的输出,所以特征更新比较单一。
- 在 DenseNet 中,每一层都能直接访问所有之前层的特征:
- 既能用到低层的 局部特征(边缘、纹理);
- 也能用到高层的 抽象特征(形状、语义)。
- 这种特征的充分融合,让表示能力更强。
👉 比喻:普通 CNN 好像“盲人摸象”,每层只能摸到前一部分;DenseNet 是“信息共享”,大家把摸到的都汇报出来,拼起来就是完整的大象。
2.内置的正则化效果 - 由于每层都会接收很多不同来源的特征输入,这种多样化输入减少了模型“过拟合某种特征”的风险。
- 同时,拼接操作让不同路径的特征强制组合,起到类似 Dropout/正则化 的效果。
- 这样网络在训练时不会太依赖某个单一特征,更容易学到“普适规律”。
👉 比喻:普通 CNN 像一个学生只看一本参考书,容易偏科;DenseNet 像学生有几十本参考书,综合学习,不容易走偏。
3.泛化能力更强 - 正则化的结果就是 泛化能力提升:DenseNet 在测试集、迁移学习任务上表现更好。
- 论文里也强调:DenseNet 在参数更少的情况下,依然能取得比 ResNet 更优的准确率,这部分得益于它“内置的正则化机制”。
3、DenseNet 的网络结构
DenseNet 的核心结构主要由 Dense Block(密集块) 和 Transition Layer(过渡层) 两部分交替堆叠而成,最终接分类层。
(1)整体架构
- 输入层
- 一般先用一个 7×7 卷积 + 池化层 进行降采样,得到初步的特征图。
- Dense Block + Transition Layer 的堆叠
- 整个网络由若干个 Dense Block 组成。
- 在两个 Dense Block 之间插入 Transition Layer,用于 降维和降采样。
- 分类层
- 最后接一个 全局平均池化(Global Average Pooling),再接全连接层输出分类结果。
(2)Dense Block(密集块)
- 结构单元(Bottleneck Layer)
Dense Block 里的每一层都是一个 Bottleneck Layer,结构是:
- BN → ReLU → 1×1 卷积 → BN → ReLU → 3×3 卷积
- 1×1 卷积:先做降维,把拼接后的“大量特征通道”压缩,减少计算量。
- 3×3 卷积:再在压缩后的特征上提取新信息。
- 这样每层都只产生相对少量的 新特征,而不是重新学习一整套特征。
👉 比喻:1×1 卷积像“过滤器”,把冗余信息压缩掉;3×3 卷积再从中“提炼精华”。
- Growth Rate (k) 的作用
- 在 DenseNet 里,每一层并不是输出完整通道数,而是只增加 k 个新的通道。
- 所以随着网络加深,总通道数 = 初始通道数 + k × 层数。
- 常见的 k 值有 12、24、32。
- 比如 k=32,意味着每一层只增加 32 个新的 feature map。
- 即使 DenseNet 很深,计算量也不会指数级增长。
👉 比喻:开会时,每个人只补充几句话(k 条新信息),而不是每次都重新写一本书。最终会议记录很全面,但不臃肿。
(3)Transition Layer(过渡层)
- 为什么需要 Transition Layer?
- 在 Dense Block 里,每一层都会输出新的 k 个特征图,并与之前的特征拼接。
- 结果就是:层数越多 → 通道数(特征图数量)越大 → 计算量和内存急剧膨胀。
- 如果不加控制,网络会变得又大又慢,训练和推理都难以进行。
👉 所以需要 Transition Layer 来“消化一下 Dense Block 吐出的庞大信息”,把特征压缩到合理规模。
- Transition Layer 的结构
Transition Layer 一般由三步组成: - BN(Batch Normalization)
- 对特征做归一化,保持分布稳定,利于训练收敛。
- 类似于“数据整理”,避免信息太乱。
- 1×1 卷积(通道压缩)
- 把高维的通道数压缩到更小。
- 压缩比例由 Compression Rate (θ) 控制。
- θ=1:不压缩
- θ=0.5:通道数减半
- 例如,前一个 Dense Block 输出了 512 个通道,θ=0.5 时,1×1 卷积会把它压缩成 256 个。
👉 比喻:像是会议记录太厚了,1×1 卷积就像编辑,把重复或冗余的内容删掉,变成一本更精简的摘要。
- 2×2 平均池化(空间下采样)
- 在空间维度上缩小特征图(比如 32×32 → 16×16)。
- 好处:
- 降低计算量(图片变小,卷积更快)
- 扩大感受野(能看到更大范围的上下文信息)
(4)分类层
- Dense Block 堆叠完成后,接 全局平均池化层(把空间特征压缩为 1×1),再接一个全连接层做分类。
- 不再用传统的全连接层堆叠,减少过拟合。
(5)网络规模举例(DenseNet-121)
- DenseNet 有不同深度的版本,例如 DenseNet-121、169、201、264。
- 以 DenseNet-121 为例:
- 初始卷积 + 池化
- Dense Block (6 层) → Transition
- Dense Block (12 层) → Transition
- Dense Block (24 层) → Transition
- Dense Block (16 层)
- 全局平均池化 + 全连接分类
4、基于 DenseNet 的后续改进模型
DenseNet 的核心思想是 特征重用(feature reuse)+ 高效梯度传播。虽然它在参数效率和准确率上表现优异,但也存在一些问题:
- 通道数不断累积,导致特征图存储开销大(内存占用高)。
- 拼接(concat)方式虽然高效,但在极深网络中依然可能冗余。
- 在更大规模任务(如检测、分割)中需要更灵活的设计。
因此,很多后续工作在 DenseNet 基础上提出了改进或变种模型。
- CondenseNet(ICCV 2017)
- 核心改进:提出 learned group convolution(学习型分组卷积),通过稀疏化 + 结构化剪枝来减少通道之间的冗余连接。
- 动机:DenseNet 的拼接虽然高效,但依然引入了很多冗余特征,CondenseNet 自动学习“哪些连接是必要的”。
- 效果:在保持精度的情况下,显著减少参数和计算量,更适合移动端/嵌入式设备。
- PeleeNet(NeurIPS Workshop 2018)
- 核心改进:结合 DenseNet 的 Dense Block 和 轻量化设计(类似 MobileNet 的深度可分离卷积)。
- 动机:将 DenseNet 的高效特征利用和轻量网络结合,用于实时计算机视觉任务。
- 效果:在移动设备上实现高效推理,广泛用于检测与识别。
- DPN (Dual Path Network)(NeurIPS 2017)
- 核心改进:结合 ResNet 的残差连接 和 DenseNet 的特征拼接。
- 一部分通道走“相加路径”(残差),实现特征重用。
- 一部分通道走“拼接路径”(DenseNet),实现特征累积。
- 动机:ResNet 强调“特征重用”,DenseNet 强调“特征扩展”,DPN 融合两者。
- 效果:在图像分类和检测上均优于单纯的 ResNet 或 DenseNet。