(B站TinyML 教程学习笔记)C27 - 卷积神经网络 CNN 入门+C28 - 修改神经网络架构+C29 - 部署关键词识别系统
Edge Impulse 卷积神经网络(CNN)与语音识别部署学习笔记
00:06 - 00:39
CNN(卷积神经网络)简介
主要内容
-
之前学习的是:
-
全连接神经网络(Dense Neural Network)(善于处理平铺数据,像姿态传感器数据)
-
用于动作分类
-
这节开始学习:
CNN(卷积神经网络)
(是像人一样看轮廓看特征,天生适合搞图像)
也叫:
-
ConvNet
-
卷积网络
-

CNN 的核心作用
CNN 适合:
-
图像分类
-
图像分析
-
语音特征识别(MFCC)
原因:
-
CNN 会自动寻找输入中的特征和模式
例如:
-
边缘
-
圆形
-
纹理
-
五官
-
动物轮廓
00:42 - 01:31
卷积层(Convolution Layer)
CNN 最重要的部分:
卷积层里有什么?
Filter(滤波器)
也叫:
Kernel(卷积核)
卷积核的作用
它会自动学习:
-
哪些图像特征最重要
-
哪些纹理最关键
例如:
-
毛发
-
木纹
-
草地
-
边缘
CNN 的层级特征提取
浅层:
识别简单特征
深层:
识别复杂特征
更深层:
识别完整物体
01:38 - 02:30
CNN 为什么耗内存?

Edge Impulse 默认:
-
第一层有 8 个滤波器
意味着:
-
一张输入图像
→ 变成 8 张特征图
下一层如果有:
-
16 个滤波器
则:
-
每张图继续生成更多特征图
问题
图像数量会爆炸增长:
1张输入图
↓
8张特征图
↓
128张特征图
因此:
-
占用大量 RAM
-
占用计算时间
解决办法
使用:
最大池化(Max Pooling)
作用:
-
压缩特征图尺寸
-
减少计算量
02:34 - 03:39
卷积到底怎么计算?
灰度图像

CNN 处理中:
图像本质:
-
数字矩阵
每个像素:
-
就是一个数值
通常会:
-
归一化到 0~1
卷积计算过程
卷积核:
例如:

分别乘以对应的权重再相加即可
工作原理
卷积核(像素合体):
-
与图像局部区域逐元素相乘
-
再全部相加
生成:
-
新像素值
然后:
-
滑动到下一个区域继续计算(这里的步长为1)
-

这个过程:
就叫卷积(Convolution)
03:43 - 04:15
CNN 中的重要参数
(1)Kernel Size(卷积核大小)
例如:
-
3×3
-
5×5
属于:
超参数(Hyperparameter)
需要自己调试。
(2)卷积核参数
卷积核中的数值(权重):
-
会自动训练更新
通过:
反向传播(Backpropagation)
学习:
-
根据答案改权重
(3)ReLU 激活函数
(增加非线性,不加模型只会画直线,这样才能学会更复杂的东西)
CNN 中常用:
ReLU
作用:

含义:将所有小于0的数置为0

-
小于0 → 直接变0
-
大于0 → 保留
作用:
-
强化特征
-
增加非线性能力
04:18 - 05:56
一维卷积(1D CNN)

为什么使用 1D CNN?
二维卷积:
-
计算量太大
对于 MFCC(上图就是美尔频率倒谱系数):
其实它只是:
-
二维数字矩阵
因此:
-
可以使用 1D 卷积
MFCC 的结构
宽度:
-
13(频率特征)
长度:
-
49(时间帧)
为什么卷积核横向移动?
因为:
要保留时间信息
语音识别中:
-
时间顺序非常重要

Edge Impulse 默认
卷积核:
-
宽度 = 13
-
长度 = 3
即:
覆盖所有频率
只观察短时间变化
05:56 - 08:30
最大池化(Max Pooling)

最大池化作用
作用:
-
压缩特征图
-
降低计算量
-
保留最明显特征
工作原理
例如窗口:
0.1 0.3
0.2 0.38
最大池化输出:
-
0.38
平均池化
另一种方法:
Average Pooling
取平均值。
Edge Impulse 默认池化参数
窗口:
-
1×2
步长:
-
2
因此:
-
数组长度减半
为什么会补零?
如果数组长度是奇数:
例如:
-
49
Edge Impulse:
-
会自动补0
变成:
-
50
这样池化窗口才能完整移动。
08:30 - 09:39
CNN 最后的分类器

CNN 分两部分:
第一部分
负责:
特征提取
包括:
-
卷积
-
池化
第二部分
负责:
分类
通常是:
全连接神经网络(Dense)
Flatten(展平)
卷积输出:
-
多维矩阵(多个一维矩阵组成的多维矩阵)
分类器需要:
-
一维数组
因此:
-
先展平(Flatten)
Softmax 分类
最终输出:
概率
例如:
hello 0.92
stop 0.03
noise 0.04
unknown 0.01
09:54 - 11:13
Edge Impulse 训练流程
进入:
Neural Network Classifier 页面
可以修改:
-
卷积层大小
-
滤波器数量
-
节点数量
但教程建议:
-
先保持默认
Dropout(丢弃层)
作用:
防止过拟合
工作原理
训练时:
随机忽略:
-
25% 神经元输出
让模型:
-
不依赖某些固定节点
增强泛化能力。
11:13 - 12:00
模型测试
训练完成后:
重点观察:
(1)Loss(损失值)
越低越好。
(2)Accuracy(准确率)
越高越好。
(3)Confusion Matrix(混淆矩阵)
查看:
-
哪些词容易误分类
准确率参考
90%~95%
很好。
85%
演示项目够用。
12:16 - 17:40
超参数调节
(1)Epoch
含义:
完整训练集训练次数
一般规律
Epoch 越多:
-
模型学习越充分
但:
-
训练更久
理想 Loss 曲线

快速下降
↓
逐渐稳定
↓
收敛
局部最小值(Local Minimum)

模型可能:
-
卡在错误最优解
解决办法:
-
重新随机初始化训练
-
增加训练时间
过拟合(Overfitting)

表现:
训练集:
-
很好
验证集:
-
很差
解决方法
-
Dropout
-
数据增强
-
Early Stopping
-
正则化
正则化就像给模型 “定个规矩”,比如在损失函数里加一项 “惩罚”,参数越复杂、值越大,惩罚就越重。这样模型在训练时,就不得不在 “拟合数据” 和 “保持简单” 之间找平衡,最终学到的是数据里通用的规律,而不是那些偶然的噪声,所以在新数据上表现更稳。
学习率(Learning Rate)
控制:
-
参数更新速度(步长)
学习率过低
问题:
-
收敛太慢
学习率过高
问题:
-
Loss 来回震荡
Edge Impulse 默认
学习率:
-
0.005
17:54 - 18:24
数据增强(Data Augmentation)
作用:
增强泛化能力
方法
例如:
-
添加噪声
-
随机屏蔽频段
-
时间拉伸
效果
模型:
-
更抗干扰
-
更稳健
18:24 - 22:20
神经网络架构设计
网络结构没有固定答案
机器学习大量工作其实是:
调参数
↓
重新训练
↓
测试效果
↓
继续调参数
宽网络 vs 深网络
宽但浅
特点:
-
节点多
-
层少
优点:
-
记忆能力强
缺点:
-
容易过拟合
深度网络
特点:
-
层数多
优点:
-
泛化能力强
缺点:
-
计算量大
核心目标
模型尽可能小
但性能足够好
这对嵌入式尤其重要。
23:05 - 23:54
手机部署
Edge Impulse 手机测试流程
进入:
Devices 页面
步骤:
连接手机
↓
扫码
↓
打开浏览器
↓
授权麦克风
↓
实时语音推理
效果
说关键词:
-
hello
-
stop
对应概率会上升。
23:54 - 25:22
Arduino 部署
进入:
Deployment 页面
查看资源占用
包括:
-
Flash
-
RAM
-
推理时间
关键发现
MFCC 特征提取:
约 212ms
神经网络推理:
约 4ms
说明:
特征提取比AI推理更耗资源
这是 TinyML 里很经典的问题。
25:22 - 29:51
连续关键词识别(Keyword Spotting)
持续监听模式
类似:
-
Siri
-
Alexa
双缓冲区(Double Buffer)
作用:
一个缓冲区采样
↓
另一个缓冲区推理
避免:
-
数据冲突
滑动窗口 MFCC
每:
-
1/3 秒
更新一次 MFCC。
工作流程
新音频进入
↓
旧MFCC丢弃
↓
新MFCC加入
↓
重新推理
缓冲区溢出(Buffer Overflow)
如果代码太慢:
会导致:
-
音频丢失
因为:
-
新数据来不及处理
MCU 实时语音识别时间
MFCC:
约124ms
推理:
约11ms
总共:
约135ms
每 333ms 完成一次识别。
关键词触发
例如:
if (hello_score > 0.6)
{
Serial.println("Hello World");
}
本节核心总结
MFCC 提取语音特征
↓
CNN 自动提取高级特征
↓
Dense层负责分类
↓
Softmax输出概率
↓
部署到手机/MCU实时推理
更多推荐
所有评论(0)