共计 2379 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要系统化学习路径?
- 概念关联性 :神经网络、卷积网络和目标检测算法是层层递进的关系,碎片化学习容易形成知识断层
- 实践依赖性 :从理论到代码实现需要跨越数据预处理、模型调试等多道坎,系统化路径能减少试错成本
- 工程闭环 :完整的项目流程(数据→训练→评估)才能培养真正的 AI 工程能力
传统机器学习 vs 深度学习
- 特征工程 :
- 传统方法:依赖人工设计特征(如 SIFT/HOG)
-
深度方法:自动学习分层特征表示

-
数据需求 :
- 传统方法:小样本也能获得不错效果
-
深度方法:需要大量标注数据
-
计算复杂度 :
- 传统方法:CPU 即可完成训练
- 深度方法:通常需要 GPU 加速
神经网络实战(PyTorch 版)
import torch
import torch.nn as nn
class SimpleNN(nn.Module):
"""
两层全连接神经网络
输入维度: 784 (28x28 图像展开)
隐藏层: 128 神经元
输出: 10 类别概率
"""
def __init__(self):
super().__init__()
self.layers = nn.Sequential(nn.Linear(784, 128),
nn.ReLU(),
nn.Linear(128, 10)
)
def forward(self, x):
return self.layers(x)
# 数据加载示例
from torchvision import datasets, transforms
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
train_data = datasets.MNIST('../data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
# 训练循环
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = SimpleNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
for images, labels in train_loader:
images = images.view(-1, 784).to(device)
labels = labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
卷积层原理详解
计算过程
卷积操作数学表达:
$$(f * g)(x,y) = \sum_{i=-k}^{k}\sum_{j=-k}^{k} f(i,j) \cdot g(x+i, y+j)$$
其中:
– $f$ 为输入特征图
– $g$ 为卷积核(如 3 ×3 滤波器)
– $k$ 为卷积核半径
特征图变化
- 输入尺寸:$H_{in} \times W_{in} \times C_{in}$
- 输出尺寸:$H_{out} \times W_{out} \times C_{out}$
其中:
$$
H_{out} = \left\lfloor\frac{H_{in} + 2\times padding – dilation\times(kernel_size-1)-1}{stride} + 1\right\rfloor
$$
目标检测关键步骤
- 锚框生成 :
- 在特征图上每个点预设不同比例 / 尺寸的参考框
-
常用比例:[1:1, 1:2, 2:1]
-
IOU 计算 :
def calculate_iou(box1, box2): """计算两个矩形框的交并比""" x1 = max(box1[0], box2[0]) y1 = max(box1[1], box2[1]) x2 = min(box1[2], box2[2]) y2 = min(box1[3], box2[3]) inter_area = max(0, x2 - x1) * max(0, y2 - y1) box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1]) box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1]) return inter_area / (box1_area + box2_area - inter_area)
六大避坑指南
数据增强陷阱
- 错误示例 :同时应用旋转和边界填充导致特征畸变
- 正确做法 :
- 空间变换类(旋转 / 裁剪)与颜色变换类(亮度 / 对比度)分开配置
- 对关键点检测任务避免使用镜像翻转
学习率设置
- 建议初始值:
- CNN:0.001~0.01
- Transformer:0.0001~0.001
- 观察训练曲线:
- 损失震荡→调小学习率
- 下降过慢→适当增大
GPU 内存优化
- 降低 batch_size(如 64→32)
- 使用梯度累积:
for i, data in enumerate(dataloader): inputs, labels = data outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() if (i+1) % 4 == 0: # 每 4 个 batch 更新一次 optimizer.step() optimizer.zero_grad()
延伸思考
- 如何对训练好的目标检测模型进行量化压缩,使其能在移动端实时运行?
- 当标注数据有限时,有哪些半监督学习方法可以提升检测性能?
- 在部署模型到生产环境时,除了准确率还需要考虑哪些运维指标?
正文完

