第 08 章 · 四年级(小学六年级) 下学期

神经网络与PyTorch入门

手写感知机、推导梯度、搭建第一个神经网络,一路做到 MNIST 手写识别与人脸识别签到系统。

12 课时 23 个知识点 4 大易错点 3 档分层作业
一年级上一年级下二年级上二年级下三年级上三年级下四年级上四年级下五年级上五年级下六年级上六年级下七年级上七年级下
01

情景导航

用故事和生活类比打开这学期的大门,先「知其所以然」再学语法。

传统的算法是小强「写」的规则,神经网络是他「养」的生物:喂它数据,它自己长出连接;答对了奖励、答错了惩罚,一点点调权重——这就是深度学习。这学期从手推梯度开始,一路养出一个能认手写数字的 CNN,最后做出人脸识别签到系统。

💯生活类比:把新知识挂在旧经验上
🧠

神经元 = 小开关

收进一堆信号,加权求和,超过阈值就「放电」。

加权激活
🏔️

梯度下降 = 下山

蒙着眼下山,每一步都朝最陡的下坡方向迈。

损失最小化
🔍

卷积 = 手电筒扫图

一小块一小块扫描特征,走到哪照到哪,图案在哪都认得。

局部特征
🎓

迁移学习 = 转学生

数学(通用视觉能力)已经学好,来了直接学「认猫」新课。

预训练复用
核 心 口 诀感知机加激活,反向传播调权重;
Tensor自动求梯度,nn.Module搭网络;
卷积池化提特征,迁移学习省数据!
02

知识探究

神经网络与PyTorch入门 —— 共 12 课时,全部知识点一网打尽。

🧠神经网络原理(2 课时)
第1课神经网络初探
🎯 趣味项目:感知机实现📚 教学目标:掌握神经元、激活函数,在项目实战中巩固运用
神经元激活函数
Python感知机:一个神经元
import numpy as np
def neuron(x, w, b):
    z = np.dot(x, w) + b          # 加权求和 + 偏置
    return 1 if z > 0 else 0      # 阶跃激活

x = np.array([2, 1])              # 输入信号
w = np.array([0.5, -1.0])        # 权重
print("输出:", neuron(x, w, b=0.0))
运 行 结 果
输出: 1
第2课反向传播
🎯 趣味项目:手写推导梯度📚 教学目标:掌握梯度下降、链式法则,在项目实战中巩固运用
梯度下降链式法则
Python梯度下降:下山找最优
import numpy as np
w, lr = 5.0, 0.1                  # 起点、步长
for step in range(10):
    grad = 2 * w                  # f(w)=w² 的梯度
    w = w - lr * grad             # 朝下坡走一步
    print(f"第{step+1}步: w = {w:.3f}")
print("山谷(最优点)在 w = 0")
运 行 结 果
第1步: w = 4.000
第2步: w = 3.200
第3步: w = 2.560
…
第10步: w = 0.537
山谷(最优点)在 w = 0
🔥PyTorch 入门(3 课时)
第3课PyTorch初体验
🎯 趣味项目:张量运算📚 教学目标:掌握Tensor、自动求导,在项目实战中巩固运用
Tensor自动求导
PythonPyTorch:张量与自动求导
import torch
x = torch.tensor(3.0, requires_grad=True)   # 开启求导
y = x ** 2 + 2 * x                          # y = x² + 2x
y.backward()                                # 自动算梯度
print("y 对 x 的梯度:", x.grad)             # 2x+2 在 x=3 处
运 行 结 果
y 对 x 的梯度: tensor(8.)
第4课第一个神经网络
🎯 趣味项目:XOR问题解决📚 教学目标:掌握nn.Module、训练流程,在项目实战中巩固运用
nn.Module训练流程
Python第一个神经网络:解 XOR
import torch.nn as nn
net = nn.Sequential(
    nn.Linear(2, 4), nn.ReLU(),     # 隐藏层
    nn.Linear(4, 1), nn.Sigmoid())  # 输出层

X = torch.tensor([[0.,0.],[0.,1.],[1.,0.],[1.,1.]])
y = torch.tensor([[0.],[1.],[1.],[0.]])
loss_fn = nn.BCELoss()
opt = torch.optim.Adam(net.parameters(), lr=0.01)
for i in range(2000):              # 训练 2000 步
    opt.zero_grad()                # ① 清梯度
    pred = net(X)                  # ② 前向
    loss = loss_fn(pred, y)        # ③ 算损失
    loss.backward()                # ④ 反向
    opt.step()                     # ⑤ 更新
print("预测:", net(X).flatten().round())
运 行 结 果
预测: tensor([0., 1., 1., 0.])
第5课手写数字识别
🎯 趣味项目:MNIST分类📚 教学目标:掌握DataLoader、优化器,在项目实战中巩固运用
DataLoader优化器
PythonMNIST 手写数字识别(骨架)
import torch, torch.nn as nn
class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Flatten(),
            nn.Linear(784, 128), nn.ReLU(),
            nn.Linear(128, 10))          # 10 个数字类别
    def forward(self, x):
        return self.net(x)

model = Net()
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_fn = nn.CrossEntropyLoss()
# for X, y in train_loader:            # DataLoader 小批量喂
#     opt.zero_grad()
#     loss = loss_fn(model(X), y)
#     loss.backward(); opt.step()
print("训练后可达 97%+ 准确率")
运 行 结 果
训练后可达 97%+ 准确率
🔍CNN 与视觉(4 课时)
第6课卷积神经网络
🎯 趣味项目:猫和狗分类(入门)📚 教学目标:掌握CNN、池化、卷积,在项目实战中巩固运用
CNN池化卷积
PythonCNN:卷积提取特征
import torch.nn as nn
cnn = nn.Sequential(
    nn.Conv2d(1, 32, 3, padding=1),  # 卷积:提局部特征
    nn.ReLU(),
    nn.MaxPool2d(2),                 # 池化:特征减半抗位移
    nn.Conv2d(32, 64, 3, padding=1), # 越往后特征越高级
    nn.ReLU(),
    nn.AdaptiveAvgPool2d(1),         # 全局池化
    nn.Flatten(),
    nn.Linear(64, 10))               # 输出 10 类
# 输入 (批, 1通道, 28, 28) → 输出 (批, 10)
运 行 结 果
(一个识图如识字的特征提取流水线)
第7课CNN进阶
🎯 趣味项目:更准的图像分类📚 教学目标:掌握经典网络结构(LeNet),在项目实战中巩固运用
经典网络结构(LeNet)
PythonCNN 进阶:经典网络 LeNet
# 1998 年识别手写数字的网络,CNN 鼻祖
# 卷积(提特征) → 池化(压缩) → 全连接(做判断)
layers = [
    "Conv 1×6@28×28  (5×5 卷积核)",
    "AvgPool 2×2     (尺寸减半)",
    "Conv 6×16@14×14",
    "AvgPool 2×2     → 16×5×5",
    "Flatten → FC120 → FC84 → FC10",
]
for l in layers:
    print(" ", l)
print("精髓:层数加深 + 多卷积核 → 特征从边缘到整体逐级抽象")
运 行 结 果
  Conv 1×6@28×28  (5×5 卷积核)
  AvgPool 2×2     (尺寸减半)
  Conv 6×16@14×14
  AvgPool 2×2     → 16×5×5
  Flatten → FC120 → FC84 → FC10
精髓:层数加深 + 多卷积核 → 特征从边缘到整体逐级抽象
第8课数据增强
🎯 趣味项目:让模型更鲁棒📚 教学目标:掌握翻转、裁剪、颜色变换,在项目实战中巩固运用
翻转裁剪颜色变换
Python数据增强:让模型见多识广
from torchvision import transforms as T
aug = T.Compose([
    T.RandomHorizontalFlip(),       # 随机水平翻转
    T.RandomRotation(15),           # 随机旋转 ±15°
    T.ColorJitter(0.2, 0.2),         # 颜色抖动
    T.ToTensor(),
])
# img = aug(img):同一张图,每次喂给模型的都不一样
print("一张图变一百张,模型不再死记硬背")
运 行 结 果
一张图变一百张,模型不再死记硬背
第9课迁移学习
🎯 趣味项目:用预训练模型分类📚 教学目标:掌握冻结层、微调,在项目实战中巩固运用
冻结层微调
Python迁移学习:站在巨人肩膀上
import torch
model = torchvision.resnet18(weights="DEFAULT")
for p in model.parameters():         # 冻结全部
    p.requires_grad = False
model.fc = nn.Linear(512, 2)         # 只换最后一层:猫/狗
# 只训练这最后一层的参数(几万 vs 上千万)
运 行 结 果
(用预训练权重 + 少量数据即可达到高准确率)
🚀检测与部署(3 课时)
第10课目标检测入门
🎯 趣味项目:画框框出物体📚 教学目标:掌握YOLO思想(概念+调用),在项目实战中巩固运用
YOLO思想(概念+调用)
Python目标检测:You Only Look Once
# 分类:这是猫 → 检测:猫在哪(画框)
# YOLO 一眼看全图,一次前向就输出所有框:
#   [置信度, x中心, y中心, 宽, 高, 类别]
pred = [[0.92, 0.30, 0.40, 0.20, 0.35, "cat"],
        [0.87, 0.70, 0.55, 0.25, 0.40, "dog"]]
for conf, cx, cy, w, h, cls in pred:
    print(f"{cls}: 置信度 {conf:.0%}, 框=({cx:.0%},{cy:.0%}) {w:.0%}×{h:.0%}")
print("调用:from ultralytics import YOLO; YOLO('yolov8n.pt)")
运 行 结 果
cat: 置信度 92%, 框=(30%,40%) 20%×35%
dog: 置信度 87%, 框=(70%,55%) 25%×40%
调用:from ultralytics import YOLO; YOLO('yolov8n.pt)
第11课模型保存与部署
🎯 趣味项目:把模型做成APP📚 教学目标:掌握模型导出、推理,在项目实战中巩固运用
模型导出推理
Python模型保存与部署
import joblib
# 训练好的模型存盘,下次秒加载
# joblib.dump(model, "model.pkl")
# model = joblib.load("model.pkl")
print("sklearn 模型:joblib 一存一取")
print("PyTorch:torch.save(state_dict) → torch.load()")
print("部署三选一:")
print("  ① Web API(Flask + 一个 /predict 接口)")
print("  ② 手机端(模型转 ONNX / CoreML)")
print("  ③ 打包桌面小工具(Tkinter 界面)")
运 行 结 果
sklearn 模型:joblib 一存一取
PyTorch:torch.save(state_dict) → torch.load()
部署三选一:
  ① Web API(Flask + 一个 /predict 接口)
  ② 手机端(模型转 ONNX / CoreML)
  ③ 打包桌面小工具(Tkinter 界面)
🏆 期末项目期末项目
🎯 趣味项目:人脸识别签到系统📚 教学目标:掌握综合运用,在项目实战中巩固运用
综合运用
Python期末项目:人脸识别签到
# 流程:检测人脸 → 提取特征 → 比对库中特征
# 检测:face_recognition / OpenCV cascade
# 特征:128 维向量(同一人距离小,不同人距离大)
import numpy as np
def cosine(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
me_today  = np.array([0.11, 0.83, 0.42, 0.19])
me_photo  = np.array([0.10, 0.85, 0.40, 0.21])
classmate = np.array([0.77, 0.12, 0.55, 0.93])
print("今天 vs 我的照片:%.3f(>0.8 → 是本人)" % cosine(me_today, me_photo))
print("今天 vs 同学:%.3f(低 → 不是同一人)" % cosine(me_today, classmate))
运 行 结 果
今天 vs 我的照片:0.999(>0.8 → 是本人)
今天 vs 同学:0.491(低 → 不是同一人)
03

实践应用

每个知识点都要落到能跑、能玩、能演示的作品上。

🏆 期末项目人脸识别签到系统

期末项目是整学期知识点的综合检验场:综合运用。学生将独立完成需求拆解 → 功能实现 → 调试打磨 → 上台演示的完整闭环。

💡 验收标准:功能完整可运行、代码结构清晰、能给同学讲明白实现原理。
📊本学期课时一览表(可打印)
课次主题趣味项目知识点
1神经网络初探感知机实现神经元、激活函数
2反向传播手写推导梯度梯度下降、链式法则
3PyTorch初体验张量运算Tensor、自动求导
4第一个神经网络XOR问题解决nn.Module、训练流程
5手写数字识别MNIST分类DataLoader、优化器
6卷积神经网络猫和狗分类(入门)CNN、池化、卷积
7CNN进阶更准的图像分类经典网络结构(LeNet)
8数据增强让模型更鲁棒翻转、裁剪、颜色变换
9迁移学习用预训练模型分类冻结层、微调
10目标检测入门画框框出物体YOLO思想(概念+调用)
11模型保存与部署把模型做成APP模型导出、推理
12期末项目人脸识别签到系统综合运用
04

总结提升

把一学期的知识点串成体系,看清来路与去向。

📌知识点体系图
🧠 神经网络原理
神经元激活函数梯度下降链式法则
🔥 PyTorch 入门
Tensor自动求导nn.Module训练流程DataLoader优化器
🔍 CNN 与视觉
CNN池化卷积经典网络结构(LeNet)翻转裁剪颜色变换冻结层微调
🚀 检测与部署
YOLO思想(概念+调用)模型导出推理综合运用
🔄承上启下

◀ 上一章:四年级 上学期 · 机器学习基础

下一章 ▶:五年级 上学期 · CV与NLP双方向

💪 学完这学期,你将获得

手写感知机、推导梯度、搭建第一个神经网络,一路做到 MNIST 手写识别与人脸识别签到系统。

结业时你将带走:2 个 AI 项目(CV+NLP)+ 云端 GPU 训练经验 + NOAI 复赛实力。

05

学习检测

避开高频易错点,再用速查表把语法焊进肌肉记忆。

易错点 1

忘记清零梯度

✗ 错误写法
for epoch …:
    loss.backward()
    optimizer.step()
# 梯度越累越大
✓ 正确写法
for epoch …:
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
💡 为什么:梯度默认累加,不清零等于把上一步的方向也加进来。
易错点 2

没转 Tensor

✗ 错误写法
X = [[1,2],[3,4]]  # 列表
net(X)  # 报错
✓ 正确写法
X = torch.tensor(X, dtype=torch.float32)
net(X)
💡 为什么:PyTorch 只认 Tensor,类型和 dtype 都要对。
易错点 3

学习率乱设

✗ 错误写法
lr = 1.0  # 来回震荡不收敛
✓ 正确写法
lr = 0.001
💡 为什么:学习率太大「跨过谷底」,太小「蜗牛下山」;从 1e-3 起步。
易错点 4

推理忘 eval

✗ 错误写法
model(X)  # 测试时 BatchNorm 乱来
✓ 正确写法
model.eval()
with torch.no_grad():
    model(X)
💡 为什么:eval 关闭训练行为、no_grad 省显存,推理两件套。
📋语法速查表
功能写法一句话理解
建张量x = torch.randn(2, 3)带梯度的多维数组
自动求导loss.backward()反向传播算梯度
定义网络class Net(nn.Module):继承官方图纸
训练四步zero_grad → forward → backward → step每个 batch 的固定节拍
卷积层nn.Conv2d(1, 32, kernel_size=3)1通道进 32通道出
数据加载DataLoader(ds, batch_size=64)小批量喂食
保存模型torch.save(net.state_dict(), 'm.pt')存下学好的权重
推理模式model.eval() + torch.no_grad()考试专用姿势
分 层 作 业

练习作业

按 A / B / C 三档难度自主选择:保底完成 A 组,学有余力挑战 B、C 组。

A组·基础任选其一深入完成
  1. 手算单个感知机:权重 [0.5, -1],输入 [2, 1],偏置 0,输出?
  2. 画出 sigmoid 和 ReLU 的函数图像,标注各自特点。
  3. 画出解决 XOR 问题需要的最小网络结构(节点+连线)。
B组·提高任选其一深入完成
  1. MNIST 训到 95% 以上,保存最佳模型。
  2. 猫狗分类:对比「有数据增强 vs 无数据增强」的准确率。
  3. 冻结 ResNet 前几层只微调最后分类层,记录对比。
C组·挑战任选其一深入完成
  1. 人脸识别签到系统:注册人脸 + 摄像头比对 + 打卡记录。
  2. CIFAR-10 调参实验:学习率、batch、增强手段逐项记录。
  3. 用预训练模型做一个「垃圾分类拍照识别」小程序。