使用TensorFlow和RaspberryPiPico识别音乐流派-第2部分
立即解锁
发布时间: 2025-08-31 00:22:44 阅读量: 10 订阅数: 15 AIGC 

# 使用TensorFlow和Raspberry Pi Pico识别音乐流派 - 第2部分
## 1. RNN架构设计
在进行模型训练之前,我们需要了解RNN架构的设计原理。RNN有多种架构变体,常见的有“多对多”和“多对一”架构。
### 1.1 多对多架构
“多对多”架构在每个时间步都接收输入并产生输出,常用于解决序列到序列的任务,如语音识别或语言翻译。Keras API中的LSTM层接收一个3D输入张量,由特征列、时间步行和批量大小维度组成。在我们的项目中,特征数量对应于每个时间步获得的MFCC数量。
### 1.2 多对一架构
“多对一”架构在每个时间步接收输入,但只在最后一个时间步产生输出,常用于分类问题,因此本项目采用了这种架构。通常,建议使用由两个或更多LSTM层组成的堆叠LSTM架构来学习输入的复杂特征表示,从而提高准确性。除最后一层外,所有LSTM层都应在每个时间步返回输出。
以下是RNN架构的对比表格:
| 架构类型 | 输入输出特点 | 应用场景 |
| ---- | ---- | ---- |
| 多对多 | 每个时间步接收输入并产生输出 | 序列到序列任务,如语音识别、语言翻译 |
| 多对一 | 每个时间步接收输入,仅最后时间步产生输出 | 分类问题,如音乐流派分类 |
### 1.3 避免过拟合
在训练LSTM RNN时,网络很容易过拟合。因此,建议包含一个丢弃率较大(如0.5)的丢弃层,以降低这种风险。
## 2. 设计和训练LSTM RNN进行音乐流派分类
在Colab笔记本中继续工作,按照以下步骤设计和训练LSTM RNN来对音乐流派进行分类:
### 2.1 提取MFCC特征
```python
import os
# 初始化存储MFCC和标签的列表
x = []
y = []
# 定义音乐流派列表
LIST_GENRES = ['disco', 'jazz', 'metal']
for genre in LIST_GENRES:
folder = train_dir + "/" + genre
list_files = os.listdir(folder)
for song in list_files:
filepath = folder + "/" + song
try:
ad, sr = sf.read(filepath)
# 训练音频长度(样本数)
TRAIN_AUDIO_LENGTH_SAMPLES = 22050
num_it = int(len(ad) / TRAIN_AUDIO_LENGTH_SAMPLES)
for i in range(num_it):
s0 = TRAIN_AUDIO_LENGTH_SAMPLES * i
s1 = s0 + TRAIN_AUDIO_LENGTH_SAMPLES
src_audio = ad[s0 : s1]
mfccs = extract_mfccs_cmsis(
src_audio,
NUM_MFCCS,
FRAME_LENGTH,
FRAME_STEP,
hann_lut_q15,
mel_wei_mtx_q15,
log_lut_q13_3,
dct_wei_mtx_q15)
x.append(mfccs.tolist())
y.append(LIST_GENRES.index(genre))
except Exception as e:
continue
```
### 2.2 转换为NumPy
0
0
复制全文
相关推荐








