108 Star 864 Fork 1.5K

MindSpore/models

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

目录

CTCModel介绍

CTCModel利用CTC准则训练RNN模型,完成语素标记任务。CTC 的全称是Connectionist Temporal Classification,中文名称是“连接时序分类”,这个方法主要是解决神经网络label 和output 不对齐的问题,其优点是不用强制对齐标签且标签可变长,仅需输入序列和监督标签序列即可进行训练。 CTC被广泛的应用在语音识别,OCR等任务上,取得了显著的效果。

论文: Alex Graves, Santiago Fernández, Faustino J. Gomez, Jürgen Schmidhuber: Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks. ICML 2006: 369-376

模型架构

模型包括
一个两层的双向LSTM模型,输入维度为39,即提取出的语音特征的维度
一个全连接层,输出维度为62,标签数+1,61代表空白符号

数据集

使用的数据集为: TIMIT,包含WAV,WRD,TXT,PHN四种格式的文件
官网的TIMIT数据集收费,同时原始的TIMIT数据集中的.WAV文件并不是真正的.wav文件, 而是.sph文件,不能直接使用,需要转化成.wav文件,在这里提供转化后的TIMIT数据集的下载链接
对下载解压后的数据预处理:

  • 读取语音数据和标签数据,通过mfcc和二阶差分提取语音信号特征
  • 对处理后的数据进行填充,并将处理后的数据转化为MindRecord格式
  • 这里提供了数据预处理的脚本preprocess_data.sh,将在后面数据预处理脚本部分详细介绍
  • 预处理后的训练集长度为4620,测试集长度为1680

环境要求

pip install -r requirements.txt

脚本说明

脚本及样例代码

CTCModel
├── scripts
│   ├── eval.sh                        #评估脚本
│   ├── preprocess_data.sh             #预处理数据脚本
│   ├── train_alone.sh                 #单卡训练脚本
│   └── train_distributed.sh           #分布式训练脚本
├── src
│   ├── dataset.py                     #加载数据
│   ├── eval_callback.py               #边训练边测试
│   ├── loss.py                        #自定义损失函数
│   ├── metric.py                      #自定义指标
│   ├── model_for_eval.py              #自定义评价网络
│   ├── model_for_train.py             #自定义训练网络
│   ├── model.py                       #模型骨干文件
│   └── model_utils
│       ├── config.py                 #解析配置文件
│       ├── device_adapter.py         #区分本地/modelarts文件
│       ├── __init__.py
│       ├── local_adapter.py           #本地训练获取设备信息
│       └── moxing_adapter.py          #model arts配置,交换文件
├── default_config.yaml                 #参数配置文件
├── eval.py                             #评估网络
├── export.py                           #导出MINDIR格式
├── preprocess_data.py                  #预处理数据
└── train.py                            #训练网络

脚本参数

数据预处理、训练、评估的相关参数在default_config.yaml文件

数据预处理相关参数
dataset_dir      保存预处理得到的MindRecord文件的目录
train_dir        预处理前的原始训练数据的目录
test_dir         预处理前的原始测试数据的目录
train_name       预处理后的训练MindRecord文件的名称
test_name        预处理后的测试MindRecord文件的名称  
模型相关参数
feature_dim               输入特征维度,与预处理后的数据维度一致,39
batch_size                batch大小
hidden_size               隐藏层维度
n_class                   标签数,模型最后输出的维度,62
n_layer                   LSTM层数
max_sequence_length       序列最大长度,所有序列都填充到这一长度,1555
max_label_length          标签最大长度,所有标签都填充到这一长度,75
训练相关参数
train_path                 训练集MindReord文件
test_path                  测试集MindRecord文件
save_dir                   保存模型的目录
epoch                      迭代轮次
lr_init                    初始学习率
clip_value                 梯度裁剪阈值
save_check                 是否保存模型
save_checkpoint_steps      保存模型的步数
keep_checkpoint_max        最大保存模型的数量
train_eval                 是否边训练边测试
interval                   每隔多少步做一次测试
run_distribute             是否分布式训练
dataset_sink_mode          是否开启数据下沉
评估相关参数
test_path                  测试集MindRecord文件
checkpoint_path            模型保存路径
test_batch_size            测试集batch大小
beam                       greedy decode(False)还是prefix beam decode(True),默认为greedy decode
export相关参数
file_name                   导出文件名
file_format                 导出文件格式,MINDIR
配置相关参数
enable_modelarts             云上训练
device_traget                硬件,只支持ASCEND
device_id                    设备号

数据预处理过程

数据预处理

数据预处理之前请先确认安装python-speech-features库 运行示例:

python preprocess_data.py \
--dataset_dir ./dataset \
--train_dir /data/TIMIT/TRAIN \
--test_dir /data/TIMIT/TEST \
--train_name train.mindrecord \
--test_name test.mindrecord
参数:
    --dataset_dir        存储处理后的MindRecord文件的路径,默认为./dataset,会自动新建
    --train_dir          原始训练集数据所在目录
    --test_dir           原始测试集数据所在目录
    --train_name         生成的训练文件名称,默认为train.mindrecord
    --test_name          生成的测试文件名称,默认为test.mindrecord
    其他参数可以通过default_config.yaml文件设置

或者可以运行脚本:

bash scripts/preprocess_data.sh [DATASET_DIR] [TRAIN_DIR] [TEST_DIR]

三个参数均为必须,分别对应上面的 --dataset_dir,--train_dir,--test_dir 数据预处理过程较慢,大约需要十几分钟时间

训练过程

训练

  • 单卡训练

运行示例:

python train.py \
--train_path ./dataset/train.mindrecord0 \
--test_path ./dataset/test.mindrecord0 \
--save_dir ./save \
--epoch 120 \
--train_eval True \
--interval 5 \
--device_id 0 > train.log 2>&1 &
参数:
    --train_path         训练集文件路径
    --test_path          测试集文件路径
    --save_dir           模型保存路径
    --epoch              迭代轮数
    --train_eval         是否边训练边测试
    --interval           测试间隔
    --device_id          设备号
    其他参数可以通过default_config.yaml文件设置

或者可以运行脚本:

bash scripts/train_alone.sh [TRAIN_PATH] [TEST_PATH] [SAVE_DIR] [DEVICE_ID]

四个参数均为必须,分别对应上面的 --train_path,--test_path,--save_dir,--device_id 上述命令将在后台运行,可以通过train.log查看结果
第一个epoch算子编译时间较长,约60分钟,之后每个epoch约7分钟

  • 分布式训练

分布式训练脚本如下

bash scripts/train_distributed.sh [TRAIN_PATH] [TEST_PATH] [SAVE_DIR] [RANK_TABLE_FILE]

四个参数均为必须,分别为训练集mindrecord文件路径,测试集mindrecord文件路径,模型保存路径,分布式配置文件路径

  • ModelArts训练

modelarts8卡训练
(1)上传代码到桶里
(2)上传处理数据到桶里
(3)设置代码目录、启动文件、数据集、训练输出位置、作业日志路径
(4)设置参数:
在网页设置参数 enable_modelarts=True
在网页设置参数 run_distribute=True
在网页设置参数 local_train_path对应容器内训练文件路径,如/cache/dataset/train.mindrecord0
在网页设置参数 local_test_path对应容器内测试文件路径,如/cache/dataset/test.mindrecord0
(5)设置节点
(6)创建训练作业

评估过程

评估

评估之前请确认安装edit-distance库 运行示例:

python eval.py \
--test_path ./dataset/test.mindrecord0 \
--checkpoint_path ./save/best.ckpt \
--beam False \
--device_id 0 > eval.log 2>&1 &
参数:
    --test_path          测试集文件路径
    --checkpoint_path    加载模型的路径
    --device_id          设备号
    --beam               greedy解码还是prefix beam解码
    其他参数可以通过default_config.yaml文件设置

或者可以运行脚本:

bash scripts/eval.sh [TEST_PATH] [CHECKPOINT_PATH] [DEVICE_ID]

3个参数均为必须,分别对应上面的 --test_path,--checkpoint_path,--device_id 上述命令在后台运行,可以通过eval.log查看结果,测试结果如下

greedy decode运行结果
{'ler': 0.3038}
prefix beam search decode运行结果
{'ler': 0.3005}

prefix beam search默认beam_size为5,结果稍好,但由于是自己实现,速度非常慢,评测一次大约1小时,建议使用greedy,评测一次约5分钟

导出mindir模型

导出

python export.py --checkpoint_path="./save/best.ckpt"

推理过程

推理前需参照 MindSpore C++推理部署指南 进行环境变量设置。

推理

用法

在执行推理之前,需要通过export.py导出mindir文件。输入数据文件为bin格式。

bash scripts/run_infer_310.sh [MINDIR_PATH] [TEST_PATH] [NEED_PREPROCESS] [DEVICE_ID]

四个参数分别代表mindir文件地址,测试集数据保存路径,是否预处理数据,设备号

结果

推理结果保存在当前路径,可在acc.log中看到最终精度结果。

LER:{'ler': 0.3038}

模型描述

性能

训练性能

参数 CTCModel
资源 Ascend910
上传日期 2021-11-3
MindSpore版本 1.3.0
数据集 TIMIT,训练集长度4620
训练参数 8p, epoch=300, batch_size = 64, lr_init=0.01,clip_value=5.0
优化器 Adam
损失函数 CTCLoss
输出 LER(预测标签序列和真实标签序列之间的编辑距离,越小越好)
损失值 24.5
运行速度 1p 6299.475 ms/step
训练总时间 8p:约7h;

推理性能

参数 CTCModel
资源 Ascend910
上传日期 2021-11-3
MindSpore版本 1.3.0
数据集 TIMIT,测试集大小1680
batch_size 1
输出 LER:0.3038(greedy decode) LER:0.3005(prefix beam decode)

随机情况说明

随机性主要来自下面两点:

  • 参数初始化
  • 轮换数据集

ModelZoo主页

ModelZoo主页.

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mindspore/models.git
git@gitee.com:mindspore/models.git
mindspore
models
models
master

搜索帮助