DenseNet和FractalNet

DenseNet和FractalNet


参考资料:https://blog.youkuaiyun.com/qq_39297053/article/details/130675478?spm=1001.2014.3001.5502

前言

作为CVPR2017年的Best Paper, DenseNet脱离了通过加深网络层数(VGG,ResNet)和加宽网络结构(GoogLeNet)来提升网络性能的定式思维, 从特征的角度考虑, 通过特征重用和旁路(Bypass)设置,既大幅度减少了网络的参数量,又在一定程度上缓解了梯度弥散问题的产生. 结合信息流和特征复用的假设, DenseNet当之无愧成为2017年计算机视觉顶会的年度最佳论文。另外,本文还对FractalNet进行了介绍,FractalNet与DenseNet的设计思想有异曲同工之妙。

先列下DenseNet的几个优点,感受下它的强大:

  • 1、减轻了vanishing-gradient(梯度消失)
  • 2、加强了feature的传递,更有效地利用了不同层的feature
  • 3、网络更易于训练,并具有一定的正则效果.
  • 4、因为整个网络并不深,所以一定程度上较少了参数数量
Model Architecture

image-20230627093441833

resNet做的是相加,而DenseNet做的是通道维度上的拼接

DenseBlock

虽然这些残差模块中的连线很多,但是它们代表的操作只是一个空间上的拼接,并不是实际上的加减乘除运算,所以DenseNet相比传统的卷积神经网络可训练参数量更少。但是,为了在网络深层实现拼接操作,必须把之前的计算结果保存下来,这就比较占内存了。这是DenseNet的一大缺点。

image-20230627094013624

Down-sampling Layer

由于在DenseNet中需要对不同层的feature map进行cat操作,所以需要不同层的feature map保持相同的feature size,这就限制了网络中Down sampling的实现.为了使用Down sampling,作者将DenseNet分为多个stage,每个stage包含多个Dense blocks, 如下图所示:

c5ada06bea0543b78ddc85ad71506d4f

在同一个Denseblock中要求特征图尺寸保持相同大小,在不同Denseblock之间设置Transition Layers实现下采样操作,具体来说,transition Layer由BN+Conv(kernel size 1×1)+average-pooling(kernel size 2×2)组成。

注意这里1×1卷积是为了对特征通道数量进行降维;而池化才是为了降低特征图的尺寸。

在DenseNet模型中,Dense Block的每个子结构都将前面所有子结构的输出结果作为输入。例如,假设我们考虑Dense Block(3),该Block包含32个3×3的卷积操作。如果每一层输出的特征通道数为32,那么第32层的3×3卷积操作的输入通道数将是前31层所有输出的累积,即31×32,加上上一个Dense Block的输出特征通道数。这可以使得特征通道数达到近1000。

为了降低特征通道数,DenseNet在每个Dense Block后引入了Transition Layer,其中使用了1×1的卷积核进行降维操作。Transition Layer有一个参数名为’reduction’,取值范围为0到1,用于控制输出通道数相对于输入通道数的比例。默认情况下,'reduction’设为0.5,这意味着Transition Layer将特征通道数减少到原来的一半,然后将结果传给下一个Dense Block。

FractalNet

FractalNet(分型网络),2016年Gustav Larsson首次提出,这个网络跟DenseNet有些类似,因此这里做简单的介绍。

  • 分形网络不像resNet那样连一条捷径,而是通过不同长度的子路径组合,网络选择合适的子路径集合提升模型表现

  • 分形网络体现的一种特性为:浅层子网提供更迅速的回答,深层子网提供更准确的回答

image-20230627105050802

  1. 图中以粉红色的卷积层Convolution为基础层,实际上可以为其它类型的层或者子网络;

  2. 绿色的Join层一般可以用相加或concat,这里采取了相加然后取平均,因此所有基础层可以使用一样的channel数量

  3. f C ( Z ) f_C(Z) fC(Z)中C表示列数,z表示输入,C=1表示一个基础层

  4. f C + 1 ( Z ) f_{C+1}(Z) fC+1(Z)则如图所示,在右边叠加两个fC(z) ,左边接一个基础层(可以对应上图左边的公式来看)

  5. f4(z)作为一个block中,如图中最右边的网络所示,完整的网络接了5个block,block之间用Pool层连接,最后是预测层

  6. 令block个数为B,每个block中的列数为C,网络的总深度为 B ∗ 2 C − 1 B*2^{C-1} B2C1

最后,路径舍弃(Drop path)也是FractalNet的贡献之一,可以看作一种新的正则化规则。

image-20230627110029126

全局是只有一个通路,

局部是至少有一个通路

总结

DenseNet是一种深度学习模型,它在计算机视觉任务中表现出色。与传统的卷积神经网络相比,DenseNet引入了密集连接的概念,使得网络内部的信息流动更加充分和高效。以下是对DenseNet模型的总结:

密集连接:DenseNet的核心思想是通过密集连接来增强特征传播和重用。在传统的卷积神经网络中,每个层只连接到其后续的层。而在DenseNet中,每个层都与后续所有层直接相连。这种密集连接使得底层的特征可以直接传递到更深层,有效地解决了梯度消失的问题。

特征重用:由于密集连接,DenseNet中的每个层都可以接收到前面所有层的特征图。这种设计使得网络能够更好地重用之前层的特征信息,从而提高了参数的利用效率和整体模型的性能。

层间特征融合:DenseNet采用了一种称为“密集块”的结构,它由多个具有相同输出尺寸的层组成。这些层通过拼接操作将其输入和输出连接在一起。这样,每个密集块都可以将前面所有层的特征融合在一起,形成更丰富的表示。

参数和计算效率:尽管DenseNet中参数的数量比传统的卷积神经网络稍多,但由于特征的重用,它在实际训练和推断中可以更好地利用参数。此外,DenseNet中的特征重用还减少了冗余计算,使得整体计算效率更高。

模型性能:DenseNet在许多计算机视觉任务上表现出色,包括图像分类、目标检测和图像分割等。由于密集连接的引入,DenseNet能够捕捉更丰富的特征表示,提高模型的准确性和鲁棒性。

总之,DenseNet通过引入密集连接的概念,实现了更充分和高效的信息流动,增强了特征重用和表示能力。这使得DenseNet成为了一个强大的深度学习模型,在计算机视觉领域得到广泛应用并取得了显著的性能提升。

image-20230627132608013

### DenseNet介绍 DenseNet是一种深度学习网络,其主要设计目的是在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来,以解决随着网络深度加深而愈加明显的梯度消失问题。在传统网络结构中,若有L层则有L个连接,而DenseNet有(L + 1)* L / 2个连接,即所有层都相互连接。例如,将X0当作Input,H2的输入就包括X0H1的输出X1 [^1]。 ### DenseNet原理 论文作者将DenseNet分成多个dense block,目的是使各个dense block内的feature map的size统一,这样在进行concatenation操作时不会出现size不匹配的问题 [^1]。 ### DenseNet应用 结合自注意力机制的密集连接图像分类算法通过Steam Block、双向密集层自注意力过渡层改进DenseNet,在Cifar - 10数据集上取得了较高的分类准确率,可应用于图像识别与检索、自动驾驶等领域 [^3]。 ### Dense层介绍 Dense层即全连接层,是神经网络中最基本的层类型。在全连接层中,每一个神经元都与上一层的所有神经元相连接。 ### Dense层原理 其原理是对输入数据进行线性变换,通过权重矩阵偏置向量,将输入数据映射到输出空间。例如,若输入维度为n,输出维度为m,则权重矩阵是一个n×m的矩阵,偏置向量是一个长度为m的向量。经过线性变换后,还可以通过激活函数引入非线性特性。 ### Dense层应用 Dense层广泛应用于各种深度学习任务中,如在图像分类任务中,通常在卷积层池化层之后使用Dense层进行特征的进一步处理分类决策;在自然语言处理中,Dense层可用于文本分类、情感分析等任务。 ```python # 以Keras为例创建一个简单的包含Dense层的模型 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential() # 添加一个有64个神经元的Dense层,输入维度为10 model.add(Dense(64, input_dim=10, activation='relu')) # 再添加一个有1个神经元的Dense层,用于二分类,使用sigmoid激活函数 model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值