第2章:深度学习基础回顾
各位同学,咱们今天聊聊深度学习的基础。说实话,这部分内容我讲过很多次,但每次讲都有新感悟。你想想看,没有扎实的基础,后面做边缘计算部署就是空中楼阁。我个人习惯把这一章叫做「热身运动」——虽然基础,但决定了你后面能跑多远。
2.1 神经网络原理:从感知机到多层网络
神经网络这东西,说白了就是模仿人脑的神经元结构。我刚开始学的时候也觉得玄乎,后来发现核心就三个东西:输入、计算、输出。
先看最简单的感知机。它接收多个输入,每个输入有个权重,加起来过个激活函数,输出0或1。嗯,就这么简单。但单层感知机有个致命问题——它解决不了异或问题。我在项目中遇到过这种情况,当时用单层网络死活拟合不了数据,后来换成多层才搞定。
多层神经网络就是堆叠多个这样的层。每一层把上一层的输出当作输入,继续做加权求和加激活。为什么多层就能解决复杂问题?因为每一层都在提取更高层次的特征。你想想看,第一层可能只看到边缘,第二层就能看到形状,第三层就能识别物体了。
核心公式回顾:
z = w1*x1 + w2*x2 + ... + wn*xn + b
a = σ(z) // σ是激活函数
反向传播就是根据输出误差,从后往前逐层调整权重w和偏置b。这个过程我建议你手推一遍,虽然现在框架都帮你做了,但理解原理对调参很有帮助。
2.2 卷积神经网络核心概念
CNN是处理图像数据的利器。为什么不用全连接?因为图像太大了。一张256x256的彩色图,展开就是196608个像素,全连接层参数多到爆炸。CNN通过局部连接和权值共享,把参数量降了几个数量级。
核心操作就三个:
- 卷积:用一个小窗口(卷积核)在图像上滑动,提取局部特征。我习惯用3x3的核,效果稳定计算量也小。
- 池化:下采样操作,常见的有最大池化和平均池化。说白了就是降维,保留主要特征丢掉冗余信息。
- 激活:ReLU现在最常用,f(x)=max(0,x)。为什么不用sigmoid?因为梯度消失问题,深层网络里sigmoid容易让梯度变0,网络就学不动了。
避坑指南:我曾经在边缘设备上部署CNN模型,发现推理速度慢得离谱。后来排查发现是卷积核尺寸选太大了。在边缘计算场景下,我建议优先用3x3卷积,配合深度可分离卷积,能大幅减少计算量。
2.3 常用框架对比:PyTorch vs TensorFlow
这两个框架我都用过,各有千秋。直接上对比表:
| 特性 | PyTorch | TensorFlow |
|---|---|---|
| 上手难度 | 低,更像Python | 中等,概念较多 |
| 调试体验 | 极好,可以随时print | 一般,需要tf.print |
| 部署支持 | TorchScript/TorchServe | TFLite/TensorRT |
| 边缘计算 | 通过ONNX转换 | 原生支持TFLite |
| 社区生态 | 学术界主流 | 工业界广泛 |
我个人习惯用PyTorch做研究和原型开发,因为调试方便。但到了边缘部署阶段,我经常把模型转成ONNX,再用TensorRT优化。你问我哪个更好?其实没有绝对答案。我建议你两个都试试,找到自己顺手的。
注意:别在框架选择上花太多时间。我见过有人纠结了两个月还没开始写代码。先选一个上手,后面迁移成本其实不高。
2.4 模型训练与推理流程
训练和推理是两回事,很多人混为一谈。我简单梳理一下:
训练流程
- 数据准备:收集、清洗、标注、增强。这一步占了我项目60%的时间。
- 模型定义:选网络结构,设置超参数。
- 前向传播:输入数据,计算输出。
- 计算损失:用损失函数衡量预测值和真实值的差距。
- 反向传播:计算梯度,更新参数。
- 迭代:重复2-5步,直到收敛。
代码示例(PyTorch风格):
for epoch in range(num_epochs):
for images, labels in dataloader:
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
推理流程
推理就简单多了:加载训练好的模型,输入新数据,直接得到输出。没有反向传播,没有梯度计算。在边缘设备上,我们通常会对模型做量化、剪枝等优化,减少计算量和内存占用。
关键区别:训练需要梯度,推理不需要。所以推理时我们可以把模型转为半精度甚至整型,速度能提升2-4倍。我在树莓派上部署过,量化后推理时间从200ms降到了60ms,效果还不错。
2.5 边缘计算场景下的特殊考量
在边缘设备上跑深度学习,跟云端完全是两码事。我踩过的坑不少,总结几点:
- 内存限制:边缘设备内存通常只有几百MB到几GB,模型不能太大。我建议用MobileNet、ShuffleNet这类轻量网络。
- 算力限制:没有GPU?用CPU推理也行,但要优化。比如用NCNN、MNN这些推理框架。
- 功耗限制:电池供电的设备,不能一直全速运行。可以考虑用NPU或TPU加速。
- 实时性要求:很多场景需要毫秒级响应,模型不能太复杂。
我的经验:做边缘计算项目,先确定硬件规格,再选模型。别反过来。我曾经在项目中期才发现设备跑不动选好的模型,结果推倒重来,浪费了两周时间。
好了,深度学习基础就回顾到这里。下一章我们开始讲模型压缩和量化,这是边缘计算部署的关键技术。有什么问题欢迎交流。