自学内容网 自学内容网

深度卷积网络

深度卷积网络

  1. LeNet-5是一种开创性的神经网络结构,针对手写数字识别的灰度图像,网络架构如下图所示:

    https://cdn.acwing.com/media/article/image/2025/01/16/181746_e13891a0d4-LeNet.png

    LeNet输入是 32 × 32 × 1 32 \times 32 \times 1 32×32×1 维的手写数字识别的灰度图像。

    卷积层 1:6 个 5 × 5 5 \times 5 5×5 卷积核,步幅 1,无 Padding,输出 28 × 28 × 6 28 \times 28 \times 6 28×28×6

    池化层 1:平均池化, 2 × 2 2 \times 2 2×2 卷积核,步幅 2,输出 14 × 14 × 6 14 \times 14 \times 6 14×14×6

    卷积层 2:16 个 5 × 5 5 \times 5 5×5 卷积核,无 Padding,输出 10 × 10 × 16 10 \times 10 \times 16 10×10×16

    池化层 2:平均池化, 2 × 2 2 \times 2 2×2 卷积核,步幅 2,输出 5 × 5 × 16 5 \times 5 \times 16 5×5×16

    全连接层:400 个节点连接到 120 个神经元,之后再接一个 84 个节点的全连接层。

    输出层:最终分类 10 个数字,使用 softmax(当时使用的是其他分类器)。

    LeNet-5参数量约为6万,激活函数为Sigmoid和Tanh,图像尺寸逐渐缩小( 32 → 28 → 14 → 10 → 5 32 \rightarrow 28 \rightarrow 14 \rightarrow 10 \rightarrow 5 322814105 ),通道数逐渐增多( 1 → 6 → 16 1 \rightarrow 6 \rightarrow 16 1616 )。

  2. AlexNet是卷积神经网络首次在计算机视觉中大规模应用,是基于ImageNet的架构,网络架构如下图所示:

    在这里插入图片描述

    AlexNet输入尺寸为 224 × 224 × 3 224 \times 224 \times 3 224×224×3,在这里暂且使用 227 × 227 × 3 227 \times 227 \times 3 227×227×3

    卷积层 1:96 个 11 × 11 11 \times 11 11×11 卷积核,步幅 4,无 Padding,输出 55 × 55 × 96 55 \times 55 \times 96 55×55×96

    池化层 1:最大池化, 3 × 3 3 \times 3 3×3 卷积核,步幅 2,输出 27 × 27 × 96 27 \times 27 \times 96 27×27×96

    卷积层 2:256 个 5 × 5 5 \times 5 5×5 卷积核,Same Padding,输出 27 × 27 × 256 27 \times 27 \times 256 27×27×256

    池化层 2:最大池化, 3 × 3 3 \times 3 3×3 卷积核,步幅 2,输出 13 × 13 × 256 13 \times 13 \times 256 13×13×256

    卷积层 3:384 个 3 × 3 3 \times 3 3×3 卷积核,Same Padding,输出 13 × 13 × 384 13 \times 13 \times 384 13×13×384

    卷积层 4:384 个 3 × 3 3 \times 3 3×3 卷积核,Same Padding,输出 13 × 13 × 384 13 \times 13 \times 384 13×13×384

    卷积层 5:256 个 3 × 3 3 \times 3 3×3 卷积核,Same Padding,输出 13 × 13 × 256 13 \times 13 \times 256 13×13×256

    池化层 3:最大池化, 3 × 3 3 \times 3 3×3 卷积核,步幅 2,输出 6 × 6 × 256 6 \times 6 \times 256 6×6×256

    全连接层:展开为 9216 个节点,经过两层 4096 节点的全连接层。

    输出层:1000 个类别,用 softmax 分类。

    AlexNet参数约为6000万,参数量显著增加,性能优于 LeNet。首次采用 ReLU 激活函数,提高训练速度。使用 GPU 加速,并分布到两个 GPU 进行训练。还引入局部响应归一化(LRN)层,但后续被证明效果有限。

  3. VGG-16是深度与规则化设计的代表,追求更深、更规整的网络结构,网络架构如下图所示:

    https://cdn.acwing.com/media/article/image/2025/01/17/181746_1c29dd99d4-VGG16.png

    VGG-16输入尺寸为 224 × 224 × 3 224 \times 224 \times 3 224×224×3 ,采用的卷积核和池化核都是一样的。

    卷积层 1:2 个 3 × 3 3 \times 3 3×3 卷积核,步幅 1,Same Padding,64 个通道,输出 224 × 224 × 64 224 \times 224 \times 64 224×224×64

    卷积层 2:2 个 3 × 3 3 \times 3 3×3 卷积核,步幅 1,Same Padding,128 个通道,输出 112 × 112 × 128 112 \times 112 \times 128 112×112×128

    卷积层 3:3 个 3 × 3 3 \times 3 3×3 卷积核,步幅 1,Same Padding,256 个通道,输出 56 × 56 × 256 56 \times 56 \times 256 56×56×256

    卷积层 4:3 个 3 × 3 3 \times 3 3×3 卷积核,步幅 1,Same Padding,512 个通道,输出 28 × 28 × 512 28 \times 28 \times 512 28×28×512

    卷积层 5:3 个 3 × 3 3 \times 3 3×3 卷积核,步幅 1,Same Padding,512 个通道,输出 14 × 14 × 512 14 \times 14 \times 512 14×14×512

    池化层:每组卷积后接一个 2 × 2 2 \times 2 2×2 最大池化层,步幅 2,尺寸减半。

    全连接层:最后将 7 × 7 × 512 7 \times 7 \times 512 7×7×512 展开为 4096,接两个全连接层, softmax 输出 1000 类。

    VGG-16参数约为1.38亿,卷积层卷积核固定为 3 × 3 3 \times 3 3×3 ,最大池化固定为 2 × 2 2 \times 2 2×2 ,结构简洁规整。每组卷积后通道数量倍增( 64 → 128 → 256 → 512 64 \rightarrow 128 \rightarrow 256\rightarrow512 64128256512 )。16层的深度网络带来更高的表达能力,但训练代价较高。

  4. 在训练深度神经网络时,由于梯度消失和梯度爆炸问题,非常深的网络会导致训练难度增加,优化算法难以有效传播梯度。普通网络中,随着深度增加,训练误差可能先减少后增多。理论上,深度网络应具有更好的表现,但普通网络难以实现这一点。

    何恺明提出了跳跃连接(Skip Connection),将某一层的激活值跳过中间的若干层,直接传递到更深层。在残差块中,激活值 a [ l ] a^{[l]} a[l] 跳过两层,直接与更深层的线性输出 z [ l + 2 ] z^{[l+2]} z[l+2] 相加。

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_ac4a32dcd5-skipconnection.png

    z [ l + 1 ] = W [ l + 1 ] a [ l ] + b [ l + 1 ] a [ l + 1 ] = g ( z [ l + 1 ] ) z [ l + 2 ] = W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ] a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]} \\ a^{[l+1]} = g(z^{[l+1]}) \\ z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]} \\ \red{a^{[l+2]} = g(z^{[l+2]} + a^{[l]})} z[l+1]=W[l+1]a[l]+b[l+1]a[l+1]=g(z[l+1])z[l+2]=W[l+2]a[l+1]+b[l+2]a[l+2]=g(z[l+2]+a[l])

    跳跃连接提供了一条额外的信息传递路径,使深层网络的梯度能够有效回传,加速收敛并改善深度网络的训练效果。

    基于跳跃连接,可以构建残差块(Residual Block)。在两层网络之间增加一条捷径,将输入直接加到输出。要注意,跳跃连接的时机是线性激活之后,ReLU激活之前

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_f166606ad5-ResidualBlock.png

    ResNet使用残差块堆叠,构建深度网络,每两层网络增加一条跳跃连接,形成一个残差块。残差块之间可能包含多个卷积层或池化层。常见的 ResNet 深度为 18 层、34 层、50 层、101 层、152 层等。实验表明,即使是 1000 多层的 ResNet,也能有效训练。

    ResNet训练误差随着深度增加仍然保持较低,在梯度消失和梯度爆炸问题上表现优异。

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_f3db0abdd5-ResNet.png

  5. 在ResNet中,残差块激活公式为 a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) = g ( W [ l + 2 ] a [ l + 1 ] + b [ l + 2 ] + a [ l ] ) a^{\left[l+2\right]} = g(z^{\left[l+2\right]} + a^{\left[l\right]}) = g(W^{\left\lbrack l + 2 \right\rbrack}a^{\left\lbrack l + 1 \right\rbrack} + b^{\left\lbrack l + 2 \right\rbrack} + a^{\left\lbrack l\right\rbrack}) a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l]) z [ l + 2 ] z^{\left[l+2\right]} z[l+2] 是通过主路径计算得到的线性激活结果, a [ l ] a^{\left[l\right]} a[l] 通过跳跃连接直接传递给更深层。

    在整个网络中使用 ReLU 激活函数,所以激活值都大于等于0。在网络中,如果使用L2正则化,会惩罚压缩 W [ l + 2 ] W^{\left\lbrack l + 2\right\rbrack} W[l+2] b [ l + 2 ] b^{\left\lbrack l + 2 \right\rbrack} b[l+2] 的值。最极端的情况就是 W [ l + 2 ] = b [ l + 2 ] = 0 W^{\left\lbrack l + 2\right\rbrack} = b^{\left\lbrack l + 2 \right\rbrack} = 0 W[l+2]=b[l+2]=0 ,最后 a [ l + 2 ] =   g ( a [ l ] ) = a [ l ] a^{\left\lbrack l + 2 \right\rbrack} = \ g\left( a^{[l]} \right) = a^{\left\lbrack l\right\rbrack} a[l+2]= g(a[l])=a[l] ,即残差块学习到的是恒等函数。即使增加两层网络,也能保证网络性能不会下降。如果隐藏层学习到有用的特征,性能会优于恒等函数。

  6. 在残差块学习的时候,需要保证 z [ l + 2 ] z^{[l+2]} z[l+2] a [ l ] a^{[l]} a[l] 的维度一致,才能相加。在ResNet中,大量使用 3 × 3 3 \times 3 3×3 的same卷积,因此能保证两者的维度一致。

    当维度不一致的时候,会通过线性变换进行调整。可以通过 W s W_s Ws 矩阵调整,假设 a [ l ] a^{[l]} a[l] 的维度为 C i n C_{in} Cin z [ l + 2 ] z^{[l+2]} z[l+2] 的维度为 C o u t C_{out} Cout,那么可以使用 W S ∈ R C o u t × C i n W_S \in \mathbb{R}^{C_{out} \times C_{in}} WSRCout×Cin 矩阵进行线性变换, a [ l + 2 ] = g ( z [ l + 2 ] + W s a [ l ] ) a^{\left[l+2\right]} = g(z^{\left[l+2\right]} + W_sa^{\left[l\right]}) a[l+2]=g(z[l+2]+Wsa[l]) ,从而将输入的特征映射到目标维度。矩阵 W s W_s Ws 可以通过反向传播进行学习优化。

  7. 1 × 1 1 \times1 1×1 卷积使用大小为 1 × 1 1 \times 1 1×1 的卷积核对输入进行卷积操作,每个卷积核对应一个权重向量,作用于输入特征图的每个位置。在通道维度上对每个位置的所有通道值进行线性组合,并添加非线性激活函数(如 ReLU),使网络能够学习复杂的非线性关系。

    另外,可以通过改变卷积核的数量调整输出通道数。压缩通道数可以降低计算复杂度。扩展通道数可以提高特征表达能力。

  8. Inception模块可以自动选择适合的卷积核大小(如 1 × 1 1\times1 1×1 3 × 3 3\times3 3×3 5 × 5 5\times5 5×5 )以及是否使用池化层,而无需人工设计,将所有可能的卷积和池化操作的输出堆叠在一起。

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_bff4fa4fd5-inception.png

    假设输入维度为 28 × 28 × 192 28 \times 28 \times 192 28×28×192 ,使用多种卷积核并行计算,使用 1 × 1 1\times1 1×1 卷积输出 28 × 28 × 64 28\times28\times 64 28×28×64 ,使用 3 × 3 3\times3 3×3 卷积输出 28 × 28 × 128 28\times28\times 128 28×28×128 ,使用 5 × 5 5\times5 5×5 卷积输出 28 × 28 × 32 28\times28\times 32 28×28×32 ,使用卷积层输出 28 × 28 × 32 28\times28\times32 28×28×32 ,将各操作的结果沿通道维度堆叠起来,形成最终输出 28 × 28 × 256 28\times28\times256 28×28×256

    然而直接使用较大的卷积核会导致极高的计算成本,例如 5 × 5 5\times5 5×5 卷积的总运算次数约为 1.2 亿次。可以通过瓶颈层降低计算成本,先使用 1 × 1 1\times1 1×1 卷积压缩通道数,再执行较大的卷积操作。对输入层 28 × 28 × 192 28 \times 28 \times 192 28×28×192 ,使用 16 个 1 × 1 × 192 1\times1\times192 1×1×192 的卷积核,输出 28 × 28 × 16 28\times28\times16 28×28×16 。对该输出执行 5 × 5 × 16 5\times5\times16 5×5×16 的卷积,最终得到 28 × 28 × 32 28\times28\times32 28×28×32 。使用瓶颈层的总计算成本为约 1204 万次,相比直接执行 5 × 5 5\times5 5×5 卷积,计算量减少至原来的十分之一,并且保留关键特征,不影响网络性能

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_d5c43e38d5-bottom.png

  9. Inception Network通过堆叠多个 Inception 模块构建网络,每个模块并行执行多种卷积和池化操作。在进行池化的时候,输出为 28 × 28 × 192 28\times28\times192 28×28×192 ,这里的通道数过多,因此采用 32 个 1 × 1 1\times1 1×1 卷积,将通道数缩小为 28 × 28 × 32 28\times28\times32 28×28×32 ,从而避免了最后输出时池化层占据大部分通道。

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_288fed90d5-inception1.png

    将9个Inception模块堆叠起来构建Inception Network,每个模块并行执行多种卷积和池化操作,支持多尺度特征提取

    同时,Inception Network在特定位置插入最大池化层或平均池化层,逐步降低特征图的空间分辨率。还在部分中间层加入分支结构,提前通过全连接层和 softmax 进行预测。有助于提高中间层的特征学习能力,防止网络过拟合。

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_198553b7d5-InceptionNetwork.png

  10. 传统卷积神经网络(如 ResNet、Inception)计算成本高,难以在低计算资源(如手机、嵌入式设备)上运行。MobileNets 提供了一种轻量级架构,能够在低计算环境中高效运行,同时保持较好的性能,主要采用的是深度可分离卷积技术。

    深度可分离卷积通过深度卷积逐点卷积替代传统卷积,大幅降低计算成本。

    深度卷积对输入的每个通道独立应用一个小的二维卷积核,计算得到对应通道的输出,输出通道数与输入通道数通道数相同。

    逐点卷积使用 1 × 1 1\times1 1×1 卷积将深度卷积的输出进行通道间的线性组合,从而调整输出的通道数。

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_c0d87cc9d5-depthwise.png

    可以证明,深度可分离卷积的计算成本约为普通卷积的31%,在实际网络中,成本可降低至1/9,性能得到了显著提升。

    MobileNet v1 架构将深度可分离卷积模块堆叠13次,形成主要网络层,最后添加池化层和全连接层,通过 Softmax 输出分类结果。

    MobileNet v2 架构对 MobileNet v1 进行了改进,深度可分离卷积依然是网络的基础,但引入了瓶颈块,增强特征学习能力并减少内存需求。还引入跳跃连接,将输入直接传递到输出,有效缓解梯度消失问题。

    瓶颈块的结构为:

    • 拓展层使用 1 × 1 1\times1 1×1 卷积,将通道数扩展为原来的 6 倍,即 n × n × n c → n × n × 6 n c n\times n \times n_c \rightarrow n\times n \times 6n_c n×n×ncn×n×6nc
    • 深度卷积对每个通道独立应用卷积,使用 Same padding,保持输出空间维度不变。
    • **投影层(逐点卷积)**使用 1 × 1 1\times1 1×1 卷积将通道数降维,投影回较小的通道数。
    • 如果输入和输出通道数一致,通过残差连接直接将输入加入输出。

    MobileNet v2 架构重复堆叠瓶颈块 17 次,使用池化层和全连接层通过 Softmax 输出分类结果。

    拓展层增加了表示能力,使网络能够学习更丰富的特征。投影层减少计算资源占用,优化内存使用。残差连接改善梯度流动,减少深度网络的训练难度。

    https://cdn.acwing.com/media/article/image/2025/01/18/181746_9c6728d9d5-mobilenet.png

  11. 手动调整网络规模(图像分辨率、深度、宽度)耗时且不一定高效,EfficientNet提供一种高效且通用的网络扩展复合缩放方法,根据特定计算预算优化网络的性能。

    神经网络的三大维度:图像分辨率 r r r 是输入图像的尺寸,提高分辨率可以捕获更多细节,但增加计算成本;网络深度 d d d 是网络层数,增加深度可以提取更高层次的特征;网络宽度 w w w 是每层网络的通道数,增加宽度可以捕获更多的特征。

    如何同时调整 r r r d d d w w w 以在计算预算内获得最佳性能?

    EfficientNet令 d = α ϕ , w = β ϕ , r = γ ϕ d=\alpha^{\phi}, w=\beta^{\phi},r=\gamma^{\phi} d=αϕ,w=βϕ,r=γϕ ,其中 ϕ \phi ϕ 表示扩展因子,用于控制整体规模的变化。而 α , β , γ \alpha,\beta,\gamma α,β,γ 分别表示深度、宽度和分辨率的比例因子,满足约束 α ⋅ β 2 ⋅ γ 2 ≈ 1 \alpha \cdot \beta^2 \cdot \gamma^2 \approx 1 αβ2γ21 ,这一约束确保网络扩展后的计算量接近恒定。

    因此,EfficientNet可以根据设备资源自动扩展或缩小网络,适用于各种计算环境。

  12. 迁移学习使用其他研究者在大规模公开数据集(如 ImageNet、MS COCO 等)上预训练好的模型和权重,作为自己任务的起点,可以节省训练时间和计算资源。

    对于小型数据集,如训练一个猫的检测器,识别三种类别,只有少量样本图片,可以下载预训练网络(如基于 ImageNet 的模型),冻结前面的层,仅训练最后的分类层(Softmax 层)。

    对于中型数据集,拥有更多标注样本,但仍不足以从头训练整个网络,可以冻结较少的层,仅训练后面的几层,或者用预训练权重初始化后几层,并从这一层开始进行梯度下降。

    对于大型数据集,样本数量足够大,可以下载预训练网络,将所有层的权重作为初始化,然后使用自己的数据训练整个网络,以优化所有层的权重。

    总的来说,迁移学习的步骤就是首先下载公开的预训练网络模型,移除原始的输出层,替换为自己的分类层。然后冻结部分层的参数,使其不可更新。数据集越小,冻结的层越多,仅训练最后的分类器。数据集越大,解冻更多层或全部层进行训练。

    加速训练的技巧:预计算固定层的输出激活值,存储在硬盘中,用这些固定激活值作为输入,仅训练最后的分类器。

    但是迁移学习也存在一定的局限性。预训练网络可能对原始任务优化过度,迁移到其他任务时存在性能损失。如果目标任务与预训练任务差异较大(如医学图像与自然图像),迁移学习效果可能不佳。

  13. 数据扩充是一种通过对现有数据进行变换,生成更多样本的技术,用于缓解数据不足的问题。

    常见的数据扩充方法:

    • 镜面对称:将图像水平翻转或垂直翻转。
    • 随机裁剪:从图像中随机裁剪不同的区域,模拟拍摄过程中不完整物体的场景。
    • 旋转:随机旋转一定角度。
    • 剪切:水平或垂直拉伸图像,使图像产生变形。
    • 局部扭曲或弯曲:模拟图像局部变形。
    • RGB通道调整:给红、绿、蓝通道分别加上或减去一定的偏差值。
    • 颜色失真:根据概率分布对 RGB 通道进行偏移,模拟光照、环境颜色变化。
    • PCA颜色增强:对颜色空间进行调整,保持图像颜色一致性但增强多样性。

    实时扩充:使用线程实现实时扩充,在模型训练的同时动态生成扩充数据,提高数据加载和处理效率。

    预处理扩充:预计算扩充后的数据并保存到硬盘,避免训练过程中反复计算扩充数据,适用于扩充计算成本较高的场景。
    通过数据扩充,可以增强模型对变换的鲁棒性,降低过拟合,也可以通过变换模拟环境变化(如光照、视角差异等),并且无需收集额外数据,通过现有数据生成更多样本。

    但是也具有一些局限性:过度裁剪或变换可能导致标签与样本不匹配(标签失真风险),某些任务对扩充方法敏感(如医学图像分类),扩充过多可能增加训练复杂性。

  14. 图像识别和对象检测是复杂的任务,需要从像素中提取信息并理解内容,即使拥有超过百万张图片的大数据集,仍可能感到数据不足。图像识别任务需要分类标签,标注成本相对较低。而目标检测任务需要边框标注,数据获取成本更高。

    当数据充足时,可以使用简单的神经网络架构,学习系统能够自动提取特征,减少手工工程的需求。数据不足时,手工工程变得重要,需要更多技巧(如特征工程、架构设计),也就是可以使用一些小tricks。

    在竞赛中,可以采用集成方法,训练多个神经网络,然后对他们的预测结果取平均。也可以采用多裁剪方法,对测试图像进行多种裁剪(如中心裁剪、四角裁剪及其镜像),将所有裁剪图像通过模型进行预测取平均。但是这些方法会增加内存需求、计算开销和运行时间,不适用于实时生产环境。


原文地址:https://blog.csdn.net/m0_60541499/article/details/145233708

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!