【经典神经网络架构解析篇】【7】DenseNet网络详解:模型结构解析、创新点、代码实现
【经典神经网络架构解析篇】【7】DenseNet网络详解:模型结构解析、创新点、代码实现
《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
目录
DenseNet的出现

在深度学习中,卷积神经网络(CNN)是许多基于视觉的任务的基石。然而,随着网络的深入,研究人员面临着两个重大挑战:
- 消失的梯度: 当梯度通过更深的层反向传播时,它们会减少,使网络难以训练。
- 特征映射中的冗余: 深度网络中的许多层学习重复的特征,导致计算和内存使用效率低下。
为了克服这些挑战,高晃等人在**《密集连接卷积网络》**(2017)论文中引入了DenseNet(密集卷积网络)。DenseNet提出了一种连接层的新方法,显著改善了梯度流,减少了冗余,增强了特征重用。
深度网络中的冗余问题
在传统的深度卷积神经网络(CNN)中,如VGG或ResNet,每一层都从前一层的输出中接收输入。每一层的输出是一组特征图-表示学习到的特征(例如,边缘、纹理或更抽象的图案)。
在特征图中冗余是如何产生的
跨层特征重叠:
- 每一层都倾向于学习那些稍微修改过或重复过的早期层的特征。
- 这是因为层被训练成顺序处理信息,而不直接知道其他层已经学习了什么。
缺乏功能重用:
- 在标准CNN中,早期学习的特征(来自初始层)不会直接被更深层重用。相反,更深的层试图从头开始学习更高级别的模式。
- 这种方法导致学习冗余或重叠的特征,特别是当较深层不能有效地从较浅层传播有用信息时。
对计算效率的影响:
- 这种冗余增加了网络的内存和计算需求。执行许多不必要的操作来重复学习类似的信息。
特征冗余示例
想象一下,一个CNN在前几层学习边缘检测。虽然后面的层需要这些边来构造复杂的图案(如曲线或纹理),但它们通常会重新学习这些与边相关的图案,而不是重用现有的图案。
DenseNet如何解决特征冗余
DenseNet引入了密集连接,以解决冗余特征学习导致的效率低下问题。其核心思想是通过密集块中每对层之间的直接连接,在所有层上重用功能。
密度连接:工作原理
- 层连接:
- 每个层接收来自同一块中所有前面层的输入。
- 该层不是独立地生成新的特征图,而是沿着通道维度连接所有先前层的输出。
2.功能重用:
- 先前层的输出(特征)由所有后续层重用。
- 这确保了每一层都建立在已经学习的特征之上,而不是重新学习冗余的模式。
3.高效的信息流:
- 密集连接确保梯度在反向传播过程中平滑流动,缓解梯度消失问题并提高训练稳定性。
4.减少参数计数:
- 由于特征被重用,网络可以用更少的参数实现高精度。不需要增加冗余过滤器的数量来学习重叠的特征。
DenseNet 与标准CNN对比(附示例)
让我们用一个例子来比较传统的CNN和DenseNet:
场景:
- 输入:28×28×3大小的图像
- 4层致密块体,增长速率k=32
在标准CNN中:
- 每一层都根据前一层的输出独立地学习新的特征。
- 每一层的输出有k=32个通道,因此经过4层后,总通道数= 32+ 32 + 32+32=128。
- 这些信道中的许多信道可能包含重叠的信息,从而导致冗余。
在DenseNet中:
- 层1学习特征并输出k=32个通道。
- 第2层接收第1层的原始输入和输出。它只学习新的功能,并输出32个以上的通道。
- 到了第4层,特征图的总数= 32×4=128,但这些图是由所有层中学习到的独特特征组成的。
- 功能的重用避免了更深层重新学习模式的需要,确保了有效的学习。
DenseNet解决的问题
DenseNet解决了ResNet等早期架构中存在的关键问题:
梯度消失问题: 在传统的卷积神经网络(如VGG或ResNet)中,随着网络层数的增加,梯度消失或梯度爆炸问题变得更为严重。DenseNet通过其独特的连接方式有效地缓解了这一问题。
参数效率: 在传统的网络结构中,每一层都只能访问到前面层的输出,这可能导致信息的浪费和重复计算。DenseNet通过让每一层都直接连接到前面所有层,提高了参数的利用效率。
特征重用: 在传统的网络中,每一层产生的特征可能只被后面的一层使用。DenseNet通过将所有层的特征都连接起来,使得后面的层可以重用前面所有层的特征,这有助于提取更丰富的信息。
DenseNet的架构

致密块

DenseNet架构基于一系列密集块,每个块包含多个卷积层。每个密集块将前一个块的输出作为输入,以及所有前一个块的输出。这在网络的所有层之间创建了密集的连接模式,允许信息更有效地通过网络流动。
DenseNet架构背后的核心思想是,每一层产生的特征图可以连接起来,形成下一层的输入。这意味着每一层的输出是所有后续层的输入。DenseNet还在每个密集块之间使用过渡层来减少空间维度和特征映射的数量。
一个例子详细解释DenseNet
让我们用简单的术语一步一步步地分解**DenseNet,**并使用一个详细的例子来进行说明,使其易于理解。
1.输入图像
网络的输入是一个尺寸为(H,W,C)的图像。这里,H是高度,W是宽度,C是通道数。
- 示例:
假设我们有一个28x28的RGB图像。尺寸为**(28,28,3)**,其中3代表红色、绿色和蓝色通道。
2.卷积层
第一层应用具有小滤波器的标准卷积(例如,3x3)来检测边缘或角落等简单特征。
- 示例如下:
我们使用3x3卷积和16个滤波器。输出将具有尺寸**(28,28,16)**。 - 输入尺寸:28x28x3
- 卷积→16个特征图(通道)。
- 输出尺寸:28x28x16。
3.致密块
在一个密集块中,每一层都从前面的所有层获取输入。这意味着每一层的输出都被连接(堆叠)并传递到下一层。这有助于重用特征并学习更好的表示。
- 示例:
假设我们在一个密集块中有3层,每层增加4个新的特征图(称为增长率= 4)。它的工作原理如下: - 第1层:输入→ 28x28x16 →添加4个新特征图→输出= 28x28x20
- 第2层:输入(连接所有以前的输出:16 + 4 = 20通道)→添加4个新的特征图→输出= 28x28x24
- 第3层:输入(20 + 4 = 24通道)→添加4个新特征图→输出= 28x28x28
- 密集块的最终输出:28x28x28。
4.过渡层
在每个密集块之后,过渡层减小特征图的大小以节省计算。它包括:
- 批次标准化:标准化稳定性激活。
- 1x1卷积:减少特征映射的数量。
- 2x2平均池:减少特征图的空间大小(高度和宽度)。
- 示例如下:
来自密集块的输入:28x28x28。 - 1x1卷积将通道减少到16→输出= 28x28x16。
- 2x2平均池大小减半→输出=14x14x16。
5.全局平均池化
全局平均池化不是将特征图扁平化,而是计算整个空间维度上每个特征图的平均值。这导致每个通道只有一个数字。
- 示例如下:
输入:14x14x16→对于16个通道中的每个通道,取所有14x14值的平均值。 - 输出:大小为16的向量。
6.全连接层
来自全局平均池化层的输出向量通过全连接层。该层学习用于分类的特征的组合。
- 示例如下:
输入:大小为16的向量→全连接层通过ReLU激活将其大小减少到256。 - 输出:256维特征向量。
7. Softmax层
最后一层应用softmax函数,输出每个类别的概率。具有最高概率的类是预测输出。
- 示例如下:
假设我们正在对手写数字进行分类(10类)。
输入:256维特征向量→ Softmax层产生10个概率(每个数字一个)。 - 输出示例:[0.01,0.05,0.02,0.80,0.02,0.05,0.03,0.01,0.00,0.01]
- 该模型预测类别3(概率为0.80)。
DenseNet的变体
DenseNet有几种针对不同任务的变体:
- **DenseNet-121、DenseNet-169、DenseNet-201、DenseNet-264:**这些是不同层数的变体,以网络中的总层数命名。
- DenseNet-BC: DenseNet的紧凑版本,包括瓶颈层和压缩,以进一步降低计算成本。
DenseNet优点
改进的信息流: 由于每一层都与前面所有层连接,网络中的信息流更加直接和丰富,有助于提高训练效率。
减少参数数量: DenseNet通过特征重用减少了网络的参数数量,这不仅可以减少模型的内存需求,还可以减少过拟合的风险。
增强特征的传递: 由于每一层都能直接获得前面所有层的特征,这有助于网络更有效地学习到复杂的特征表示。
易于训练: DenseNet的结构有助于梯度的反向传播,使得网络更加容易训练。
减少计算量: 尽管每一层都与前面所有层连接,但由于使用了较小的卷积核和较少的滤波器数量,DenseNet实际上减少了总的计算量。
DenseNet的结构通过其“稠密连接”(dense connectivity)的特性,即每一层都与前面所有层在输入上相连,输出则直接作为后面所有层的输入,实现了上述优点。这种设计使得DenseNet在许多图像识别任务中表现出色,同时保持了模型的简洁性和高效性。
DenseNet的缺点
1.高内存使用
- 原因:DenseNet连接所有先前层的输出。随着网络的深入,特征图的数量会迅速增加,从而导致高内存消耗。
- 影响:这使得DenseNet在GPU内存有限的系统上训练更具挑战性。
- 范例:
在密集块中,如果每层输出32个声道,则4层之后的声道总数将为32+ 32+32+32 = 128。随着网络的深化,增长变得显著。
2.计算开销
- 原因:特征映射的串联增加了每个层的输入大小。这会导致更高的计算成本,特别是对于更深的网络。
- 影响:与ResNet等使用求和而不是级联的架构相比,DenseNet的训练速度可能会更慢。
3.缩放问题
- 原因:虽然DenseNet适用于中小型数据集,但对于非常大的数据集或非常深的架构,它的可扩展性很差。不断增加的特征图可能会使模型变得不切实际。
- 影响:在大规模数据集(如ImageNet)上训练DenseNet需要仔细的内存管理和调优。
4.执行难
- 原因:跨层的特征映射的连接增加了模型实现的复杂性。
- 影响:与VGG或ResNet等更简单的架构相比,实施DenseNet对开发人员来说更具挑战性。它需要仔细跟踪输入/输出维度和有效的连接。
5.参数冗余
- 原因:尽管DenseNet减少了学习特征中的冗余,但密集的连接仍然会导致许多参数。连接的数量与深度成二次方增长。
- 影响:这可能导致效率低下,特别是当更简单的模型可以实现相当的性能时。
6.推理时间
- 原因:在推理过程中,串联操作可能会减慢向前传递的速度,增加预测的延迟。
- 影响:DenseNet可能不适合实时应用,例如边缘设备或低延迟任务。

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!
更多推荐

所有评论(0)