kaldi实现迁移学习

kaldi实现迁移学习

speechhome 课程 Kaldi语音识别理论与实践 石颖 第9节 https://edu.speechhome.com/p/t_pc/course_pc_detail/video/v_632490ece4b050af23b7c9e2

两种方式的迁移学习:

  1. 较多训练数据训练好的模型的参数作为初始模型参数,更新 其他领域数据/新模型结构(只有一些层不一样)的模型参数。
  2. 固定训练好的模型的大部分参数,只更新部分层(新领域数据特别特别少时,用该方法)

方法1实现:

以最后一层不一样举例,要调整最后一层结构,变成想要的输出维度。

步骤1. 把初始模型的输出维度更换成想要的维度:

思路:准备一个config文件,只保留输出维度相关的component(其他component都不要),然后用该config文件重新初始化模型,这时候旧模型的输出component会被新config里的component覆盖,旧模型其余会保留;

做法:打开config文件,手动删除其他component,只保留输出维度相关的component

image-20221009181943628

然后在vim中输入 :%s/旧维度/新维度/g进行替换,就是把config里的比如输出维度4368换成2000。

然后在命令行输入:nnet3-init final.mdl final.config final.change.output_dim.mdl

就可以了。

步骤2. 用新模型作为初始模型,在新数据集上进行训练:

在 run.sh中的 steps/nnet3/chain/train.py --trainer.input-model final.change.output_dim.mdl

方法2实现:

固定某些层参数名

第一种粗暴的方法:打开mdl.txt,将component的名称手动更改为Fixed的component

比如把改为

但是这样要改的地方很多。

第二种方法 【推荐】:

新建一个config文件(文件的第一个字段是要进行哪种操作,第二个字段是这个操作要应用在哪个component上)

该图的意思是对tdnn1-5层的仿射变换层更改为参数不可变的仿射变换层。

(比如保存在fix_config/edit_config)

image-20221009182908327

然后在命令行输入:nnet3-copy --edits-config=fix_config/edit_config --binary=false final.raw final.fix.tdnn1-5.raw

然后在 run.sh中的 steps/nnet3/chain/train.py --trainer.input-model final.fix.tdnn1-5.raw


image-20221009183631092