kaldi实现迁移学习
speechhome 课程 Kaldi语音识别理论与实践 石颖 第9节 https://edu.speechhome.com/p/t_pc/course_pc_detail/video/v_632490ece4b050af23b7c9e2
两种方式的迁移学习:
- 较多训练数据训练好的模型的参数作为初始模型参数,更新 其他领域数据/新模型结构(只有一些层不一样)的模型参数。
- 固定训练好的模型的大部分参数,只更新部分层(新领域数据特别特别少时,用该方法)
方法1实现:
以最后一层不一样举例,要调整最后一层结构,变成想要的输出维度。
步骤1. 把初始模型的输出维度更换成想要的维度:
思路:准备一个config文件,只保留输出维度相关的component(其他component都不要),然后用该config文件重新初始化模型,这时候旧模型的输出component会被新config里的component覆盖,旧模型其余会保留;
做法:打开config文件,手动删除其他component,只保留输出维度相关的component
然后在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)
然后在命令行输入: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
