今天的深度学习课程,没有涉及复杂代码,而是围绕卷积神经网络(CNN)的核心原理、经典网络发展,以及 PyTorch 神经网络工具箱的关键概念展开。对于刚接触深度学习的人来说,这些基础知识点是后续学习的 “地基”。下面结合课程 PPT 和会议纪要,用通俗的语言梳理今天的重点内容,帮你轻松理解深度学习的核心框架。

一、先搞懂:为什么需要卷积神经网络?

在卷积神经网络出现前,人们用 “多层感知机” 处理图像,但它有个致命问题 ——破坏图像空间结构。比如一张 28×28 的手写数字图片,多层感知机会把它拉成 784 个独立的数字,原本相邻像素的 “空间关系”(比如数字的边缘、拐角)全没了。而且它没有 “平移不变性”,比如同样是数字 “8”,稍微挪个位置,模型就可能认不出来,还会导致参数数量爆炸,训练起来又慢又难。

而卷积神经网络(CNN)恰好解决了这些问题,它就像 “专门看图像的眼睛”,能精准捕捉图像的局部特征,还能大幅减少参数,成为处理图像任务(比如识别、检测)的核心工具。

二、卷积神经网络的 “核心零件” 与工作逻辑

想要理解 CNN,先得认识它的 “核心零件”—— 这些组件分工明确,共同完成从 “看图像” 到 “提特征” 的过程。

1. 最关键的 “操作”:卷积

卷积是 CNN 的 “灵魂”,它的作用是提取图像的局部特征(比如边缘、纹理、形状),就像我们看画时先关注细节,再拼出整体。具体怎么做?

  • 用一个 “小窗口”(叫 “卷积核”,比如 3×3 的正方形)在图像上慢慢滑动;
  • 每滑一步,就把 “小窗口” 里的图像像素和卷积核的权重对应相乘,再加个偏置,算出一个新数值;
  • 所有新数值拼起来,就得到了 “特征图”—— 这张图里就包含了图像的局部特征(比如边缘的位置)。

更厉害的是 “参数共享”:同一个卷积核在整幅图像上复用,不用给每个像素单独设参数,比如用 3×3 的卷积核处理 28×28 的图像,只需要 9 个参数,比多层感知机的 784 个参数少太多!

2. 让 CNN 更高效的 “辅助零件”

除了卷积,还有几个关键组件让 CNN 的效果更好、计算更快:

  • 填充(Padding):防止图像边缘的特征被 “丢掉”。比如给图像边缘加一圈 0,这样卷积核滑到边缘时,不会因为 “不够位置” 而漏掉边缘像素,还能控制输出图像的大小(比如让输出和输入一样大)。
  • 池化(Pooling):给图像 “压缩瘦身”。比如 “最大池化” 会在 2×2 的小窗口里,只保留最大的那个数值;“平均池化” 则取窗口里的平均值。这样一来,图像的尺寸变小,后续计算量减少,还能让模型对图像的微小偏移更 “不敏感”(比如数字稍微挪一点,池化后特征还在)。
  • 激活函数:给 CNN “注入非线性”。卷积和池化本质上是 “线性计算”,只能处理简单的特征;激活函数(比如 ReLU、Sigmoid)能把线性结果变成非线性的,让模型能学习复杂的特征(比如区分 “猫” 和 “狗” 的不同形状)。

三、经典卷积神经网络:从 “入门款” 到 “高性能款”

CNN 不是一成不变的,这些年一直在进化,每一代经典网络都解决了之前的痛点,我们可以按 “时间线” 理解它们的演进逻辑:

网络名称 核心特点 解决的问题
LeNet(1998) 第一个成熟的 CNN,结构是 “卷积→池化→全连接” 解决了多层感知机破坏图像空间结构的问题,专门用于手写数字识别
AlexNet(2012) 比 LeNet 更深更大,用了 ReLU 激活函数、Dropout、数据增强 把 CNN 带入 “深度时代”,让模型能处理更复杂的图像(比如 ImageNet 数据集里的 1000 类物体)
VGG(2014) 更 “深” 更 “窄”(比如 VGG16 有 16 层),用重复的 “小卷积核 + 池化” 模块 证明 “更深的网络能提取更细的特征”,比如从边缘到物体的局部部件(比如猫的耳朵)
ResNet(2015) 引入 “残差块”,让输入直接 “跳着” 传到后面的层 解决了 “网络太深反而性能下降” 的问题(之前网络深了会 “梯度消失”),能做几百层的网络

特别补充:目标检测网络的演进

除了 “识别图像里有什么”,我们还需要 “找到物体在哪里”(目标检测),这部分的网络也在不断升级:

  • 两阶段网络(比如 R-CNN、Fast R-CNN、Faster R-CNN):先找 “可能有物体的区域”,再判断区域里是什么。精度高,但速度慢。
  • 单阶段网络(比如 YOLO 系列):一步到位,直接从图像里找出物体位置和类别。虽然精度稍低一点,但速度快很多,能满足 “实时检测” 需求(比如监控摄像头实时识别行人、自动驾驶实时看路况)。

四、PyTorch 工具箱:搭建神经网络的 “积木套装”

PyTorch 是深度学习常用的工具,它就像一套 “积木”,能帮我们轻松搭建神经网络。今天的课程重点讲了它的核心概念,不用代码也能理解清楚。

1. 神经网络的 “四大核心组件”

不管搭什么网络,都离不开这四个 “基础积木”,它们共同实现 “模型学习” 的功能:

  • 层(Layer):最基本的 “功能块”,负责把输入的 “数据张量”(可以理解为多维度的表格)转换成输出。比如卷积层负责提特征,全连接层负责最后分类。
  • 模型(Model):把多个 “层” 按顺序拼起来的 “整体结构”。比如 LeNet 就是 “卷积层→池化层→全连接层” 拼出来的模型。
  • 损失函数:判断模型 “学得好不好” 的 “尺子”。它计算模型的 “预测值” 和真实结果的差距 —— 差距越小,说明模型学得越好。比如分类任务用 “交叉熵损失”,回归任务用 “均方误差损失”。
  • 优化器:帮模型 “调整参数” 的 “工具”。它的目标是让损失函数的差距变小,方法是通过 “梯度下降” 等算法,一点点调整层里的权重和偏置(比如让卷积核的权重更贴合图像特征)。

这里还要分清两个易混概念:

  • 参数:模型自己学的 “变量”,比如卷积核的权重、全连接层的偏置,训练过程中会不断更新。
  • 超参数:我们提前设定的 “固定值”,比如一次训练用多少数据(批量大小)、网络有多少层、学习率(优化器调整参数的步长),这些不会随训练改变。

2. 搭建模型的两个关键工具:nn.Module vs nn.functional

PyTorch 里有两种搭模型的方式,它们适用场景不同,不用代码也能分清:

对比维度 nn.Module nn.functional
本质 “模块化” 工具,适合搭有可学习参数的层 “函数式” 工具,适合做简单的无参数操作
参数管理 自动管参数,不用我们手动记权重、偏置 不管参数,要自己传(比如自定义的权重)
适用场景 卷积层、全连接层、Dropout 层(这些需要学参数) 激活函数(比如 ReLU)、池化层(这些不用学参数)
方便程度 能和 “模型容器”(比如 nn.Sequential)一起用,搭复杂模型很方便 不能用模型容器,要手动一步步调用,适合简单操作

举个例子:如果要搭一个卷积层,用 nn.Module 的 “nn.Conv2d”,它会自动帮我们管理卷积核的权重;如果只是想给结果加个 ReLU 激活,用 nn.functional 的 “relu” 就行,不用管参数。

3. 模型训练的 “核心流程”

不管多复杂的模型,训练逻辑都一样,就像 “打怪升级” 的四步循环:

  1. 正向传播:把数据喂给模型,让模型算出 “预测值”(比如判断这张图是猫还是狗)。
  2. 算损失:用损失函数比一比 “预测值” 和真实结果的差距,差距就是 “损失”。
  3. 反向传播:根据损失,算出每个参数(比如权重)需要调整的 “方向”(这一步 PyTorch 会自动算)。
  4. 更新参数:优化器按照 “方向”,一点点调整参数,让下次的损失变小。

重复这个循环,直到损失足够小,模型就算 “学好了”。

4. 常见问题:过拟合怎么解决?

训练时可能遇到 “过拟合”—— 模型在训练数据上表现超好(比如准确率 99%),但换了新数据就不行(准确率 60%),就像学生只会背题,不会灵活解题。今天讲了一个常用办法:Dropout

它的原理很简单:训练时随机 “关掉” 一部分神经元(比如一半),让模型不能只依赖某几个神经元 “记答案”,逼它学更通用的特征;测试时再把所有神经元打开,这样模型就更能适应新数据了。

五、必记的核心名词(重点!)

今天的知识点里,这几个名词一定要记住,后续学习都会用到:

  • 卷积层(Conv Layer):CNN 提特征的核心。
  • 激活函数(Activation Function):给模型加非线性的 “开关”。
  • 池化层(Pooling Layer):给图像瘦身、降维的工具。
  • 模块容器(比如 nn.Sequential):搭复杂模型的 “辅助积木”。
  • 损失函数(Loss Function):衡量模型好坏的 “尺子”。
  • 优化器(Optimizer):帮模型调参数的 “工具人”。
  • 残差块(Residual Block):ResNet 解决深度问题的关键。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐