在正文开始之前,先给大家带来一个超值福利!
为了方便同学们快速开启人工智能学习计划,在学习过程中少走弯路用最快的效率入门Ai并开始实战项目。
我们整理了近200个Ai实战案例和项目,这些并不是网上搜集来的,而是我们这五年线上线下教学所开发和积累的案例。-* 可以说都是反复迭代更新出来的,适合同学们来进行循序渐进的学习与练手。需要的扫码
深度学习:卷积神经网络引领变革
我们之前提到的视觉项目有很多,比如目标检测,缺陷检测,图像分割等等,我们以目标检测为例子,明确一个项目的整体框架(以两阶段检测为例):
-
数据预处理:图像增强、标注格式转换
-
特征提取(核心环节):使用CNN提取图像特征 ← 这里就是AlexNet/ResNet/VGG的主战场
-
区域建议生成:生成候选框(如Faster R-CNN中的RPN网络)
-
目标分类与定位:对候选框进行分类和坐标修正
-
后处理:非极大值抑制(NMS)、结果可视化
从这个项目框架中我们能够明确,今天我们学习的这些CNN网络主要是起到特征提取的作用,这也是深度学习比机器学习区别之一,深度学习通过CNN网络从数据集中学习特征。
应该如何快速学习一个网络
逐层拆解网络结构
通过代码实现,深入理解各层的作用,仔细对比输入输出尺寸的变化,这能让我们直观地感受到数据在网络中的流动与变化。
复现经典实验
利用公开数据集,如 MNIST、CIFAR - 10、COCO数据集来训练网络。在训练过程中,密切观察训练曲线和过拟合现象,从实践中加深对网络性能的理解。
调参实践
尝试修改学习率、优化器(如 Adam 与 SGD 的对比)、批大小等参数,分析这些调整对准确率产生的影响,可参考我下面这2篇文章的调参实验,从而掌握参数对模型的调控技巧。
当Transformer遇到调优困境:工程师必备的模型性能提升路线图
迁移学习测试
加载预训练模型,冻结部分层后进行微调,验证这种方法是否适用于特定的任务,探索迁移学习在不同场景下的有效性。
本篇文章我将带领大家简单拆解各网络结构,并适当挑选几个具有代表性的实验进行复现。
经典 CNN 架构
LeNet
LeNet 是早期经典的卷积神经网络,它的网络结构相对简单,但为后续的网络发展奠定了基础。 C1卷积层, 在 LeNet 中,输入图像通常是 32x32 像素的灰度图像。首先是卷积层,例如第一个卷积层使用 6 个 5x5 的卷积核,经过卷积操作后,输出特征图的尺寸会变为 28x28(假设不考虑填充),这一层的作用是提取图像中的低级特征,如边缘、角点等。
S2下采样,接着是池化层,一般采用 2x2 的最大池化,输出特征图尺寸变为 14x14,池化操作可以降低特征图的分辨率,减少计算量,同时具有一定的平移不变性。
C3卷积层、S4采样层、C5卷积层,后续会再次经过卷积层和池化层,进一步提取和压缩特征,作用与上面一致。
F6全连接层,最后通过全连接层将特征映射到类别空间(将多维的卷积和池化输出展平为一维向量),输出最终的分类结果。
下面是LeNet 网络的代码实现:
import torch
from torch import nn
from d2l import torch as d2l
""" 默认情况下,深度学习框架中的步幅与汇聚窗口的大小相同(窗口没有重叠)"""
# nn.Sequential 是一个容器,可按顺序包装一系列子模块(如层、激活函数)。使得模型的构建变得更加简洁
net = nn.Sequential(
# 第一个二维卷积层,输入通道是1(灰度图像),输出通道是6,卷积核大小5×5,图像周围加入两层0填充
# 使用sigmod激活函数
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
# 第一个平均池化层:用2x2的池化窗口,步长为2。经此池化操作后得6个14×14的特征图
nn.AvgPool2d(kernel_size=2, stride=2),
# 这是第二个二维卷积层,输入通道数为6(与第一个卷积层的输出通道数相匹配),输出通道数为16。卷积核的大小为5x5,没有使用padding填充
# 使用sigmod激活函数
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
# 第二个平均池化层:配置与第一层平均池化层相同。
nn.AvgPool2d(kernel_size=2, stride=2),
# 在将数据传递给全连接层之前,需要将多维的卷积和池化输出展平为一维向量。以便传给全连接层
nn.Flatten(),
# 经过前面的卷积和池化操作后,输出16个5×5的特征图
# 全连接层,输入特征的数量是16 * 5 * 5。输出特征的数量是120。
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
# 全连接层,输入特征数量120,输出84
nn.Linear(120, 84), nn.Sigmoid(),
# 全连接层,输入特征数量84,输出10,对应Fashion-MNIST数据集的10个类别
nn.Linear(84, 10))
用LeNet训练MNIST数据集得到的效果如下:
在训练过程中,我们可以观察到训练曲线随着训练轮数的增加,损失逐渐下降,准确率逐步上升。
想知道具体如何用LeNet在MNIST数据集上运行?想要完整代码?扫码获取
在调参实践中,如果增大学习率,模型可能会在训练初期快速下降,但容易出现震荡甚至不收敛;若减小学习率,模型收敛速度会变慢,但可能会获得更稳定的结果。通过这些实践,能更好地理解各网络层在整个模型中的作用。
AlexNet:
第一个成功应用于大规模图像分类的深度卷积神经网络。它在 2012 年 ImageNet 图像分类竞赛中取得了巨大成功,开启了深度学习在计算机视觉领域的新篇章。AlexNet与LeNet结构十分相似。
AlexNet网络结构
这个网络包含了八层权重;前五个是卷积层,其余三个为全连接层。最后的全连接层的输出被送到1000维的softmax函数,其产生1000个类的预测。为了方便大家理解,可参考下面这个简化图。
-
输入层:接收固定大小的图像(如224x224x3),并进行预处理(如减去均值)。
-
卷积层:共有5个卷积层,每个卷积层后都跟有ReLU激活函数和(部分层后)局部响应归一化(LRN)。卷积核的大小和数量逐渐增加,以提取更复杂的特征。
-
池化层:在第1、2、5卷积层后使用最大池化(Max Pooling),其中第5层采用了重叠池化(Overlapping Pooling)。
-
全连接层:共有3个全连接层,每个全连接层后都跟有ReLU激活函数和Dropout层。
-
输出层:最后一个全连接层的输出通过softmax函数转换为概率分布,用于分类。
AlexNet创新点
下面,我们将描述一些AlexNet网络框架中新颖或不寻常的地方:
1. ReLU非线性单元:
它比起使用tanh单元作为激活函数的训练起来快了好几倍,如下图所示,该图展示了对于一个特定的四层CNN,CIFAR-10数据集训练中的误差率达到25%所需要的迭代次数。
2. 局部响应归一化:
借鉴生物中的侧抑制原理,对ReLU的输出进行归一化,有助于增加泛化能力(但后续研究证明其效果有限)。
3. 重叠池化(Overlapping Pooling):
相比传统的非重叠池化,重叠池化可以减少过拟合,提高预测精度。
4. Dropout:
在训练过程中随机丢弃部分神经元,减少神经元之间的复杂协同作用,防止过拟合。
结合许多不同模型的预测结果是减少测试错误率的一种非常成功的方法,但对于已经花费数天时间训练的大型神经网络来说,它似乎成本太高了。
然而,有一种非常有效的模型组合方法,在训练期间,只需要消耗1/2的参数。这个新发现的技术叫做“Dropout”,它会以50%的概率将隐含层的神经元输出置为0。
代码实现
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(
# 这里使用一个11*11的更大窗口来捕捉对象。
# 同时,步幅为4,以减少输出的高度和宽度。
# 另外,输出通道的数目远大于LeNet
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数
nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 使用三个连续的卷积层和较小的卷积窗口。
# 除了最后的卷积层,输出通道的数量进一步增加。
# 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Flatten(),
# 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
# 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
nn.Linear(4096, 10))
用AlexNet在ImageNet数据集上运行的效果如下: 想知道具体如何用AlexNet在ImageNet数据集上运行?想要完整代码?
与LeNet相比,这里的主要变化是使用更小的学习速率训练,这是因为网络更深更广、图像分辨率更高,训练卷积神经网络就更昂贵。 由于篇幅有限,本篇文章我们就介绍到这,下篇文章将继续为大家解析VGG、GoogleNet、ResNet网络设计思想。
看不够?📢 四大主题训练营火热上线🔥,精准匹配你的成长需求!无论你是想要突破瓶颈、提升技能,还是寻找新的成长方向,这里都有适合你的专属选择。
小结
本期聚焦经典CNN架构解析与实践:
-
目标检测框架:构建数据预处理→特征提取(CNN核心)→区域建议→分类定位全流程。
-
四步学习法:拆解结构、复现实验、调参优化、迁移学习,强化代码实践与参数洞察。
-
经典网络突破:
-
LeNet:基础卷积-池化-全连接架构,32x32灰度图像处理原型。
-
AlexNet:ReLU/Dropout/重叠池化创新,ImageNet性能飞跃。
-
-
实践验证:LeNet在MNIST训练验证性能,学习率对比揭示调参价值。