深度卷积网络

深度卷积网络

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    池化层 3:最大池化, \(3 \times 3\) 卷积核,步幅 2,输出 \(6 \times 6 \times 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 \times 224 \times 3\) ,采用的卷积核和池化核都是一样的。

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

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

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

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

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

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

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

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

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

    何恺明提出了跳跃连接(Skip Connection),将某一层的激活值跳过中间的若干层,直接传递到更深层。在残差块中,激活值 \(a^{[l]}\) 跳过两层,直接与更深层的线性输出 \(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]} \\ \red{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^{\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})\)\(z^{\left[l+2\right]}\) 是通过主路径计算得到的线性激活结果, \(a^{\left[l\right]}\) 通过跳跃连接直接传递给更深层。

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

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

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

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

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

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

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

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

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

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

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

    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\times1\) 卷积将深度卷积的输出进行通道间的线性组合,从而调整输出的通道数。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    常见的数据扩充方法:

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

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

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

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

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

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

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

posted @ 2025-01-18 22:06  钰见梵星  阅读(12)  评论(0编辑  收藏  举报