Kaldi的BaseLine训练过程
steps/train_mono.sh --nj "$train_nj" --cmd "$train_cmd" data/train data/lang exp/mono || exit 1
data lang dir
# 使用差分特征训练GMM模型
# 因为每一步训练的模型都会导致状态的均值发生变换,而决策树是与状态的分布相关的。也就是说,旧的决策树就不适用于新训练的模型。因此,需要重新为新模型训练新的决策树(根据特征和新的alignment)。
流程:
使用特征和新的alignment,为新模型训练新的决策树;
由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);
使用新的决策树初始化GMM模型,并进行训练:
总共迭代n次,即重复n次:
对每一个utterance:
将对应的alignment与多个特征进行配对,生成.acc(与.egs类似)
使用.acc训练这段alignment中出现的所有GMM(.mdl)
当n=$realign_iters时:
使用G(alignment),与H(.mdl)、C(tree)、L(L.fst),生成HCLG图,用该图与对应的多个特征进行对齐,生成新的alignment(ali.JOB.gz)
当n=$mllt_iters时:
将对应的alignment与多个特征进行配对,生成.macc(与.acc类似)
使用.macc训练一个MLLT矩阵(.mat),用这个矩阵将GMM(.mdl)的均值进行降维,输出新的模型
迭代结束
steps/train_deltas.sh --cmd "$train_cmd" 2000 11000 data/train data/lang exp/mono_ali exp/tri1 || exit 1
numleaves totgauss data lang alidir dir
feats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | add-deltas $delta_opts ark:- ark:- |"
#增量特征的计算由程序add-deltas完成,它使用ComputeDeltas函数.增量特征计算具有与HTK相同的默认设置,也就是说,为得到第一个(即左侧的)增量特征,我们将原特征乘以[-2,1,0,1,2]的滑动窗口,然后通过除以(2^2 + 1^2 + 0^2 + 1^2 + 2^2 = 10).通过用第一个增量特征的计算方法来计算第二个(即右侧的)增量特征.每一侧的上下文帧数由参数:"-delta-window"(默认值:2)来控制,要增加的delta特征数量由参数"-delta-order"(默认值:2)来控制.使用此脚本的典型脚本行是:
feats="ark:add-deltas --print-args=false scp:data/train.scp ark:- |"
acc-tree-stats 1.mdl scp:train.scp ark:1.ali 1.tacc
#收集树的统计信息,用于决策树训练。该程序读入特征(档案格式)和相应的对齐,并且生成用于创建决策树的足够的统计信息。上下文宽度(三音素的宽度为3,五音素的宽度为5)和中心音素位置(三音素的中心为2,五音素的宽度为3)用于标识上下文。转换模型(声学模型)用作输入以标识PDF(GMM)和音素。
#作上下文音素的复制
sum-tree-stats treeacc 1.treeacc 2.treeacc 3.treeacc
#将分割$nj个job后的$nj个.treeacc合并为一个.treeacc,用于建设音素上下文树
cluster-phones
#为满足多种需要,聚类音素(或聚类音素集)
compile-questions questions.txt questions.qst
#编译决策树为程序可读的格式
build-tree treeacc roots.txt 1.qst topo tree
#训练决策树
gmm-init-model [options] <tree-in> <tree-stats-in> <topo-file> <model-out> [<old-tree> <old-model>(initializing GMMs with old model)]
gmm-init-model --write-occs=$dir/1.occs $dir/tree $dir/treeacc $lang/topo $dir/1.mdl prev/tree prev/30.mdl
#用决策树和树统计信息初始化GMM,用单高斯生成混合高斯
gmm-mixup [options] <model-in> <state-occs-in> <model-out>
gmm-mixup --mix-up=4000 1.mdl 1.occs 2.mdl
#将对齐(转录)从一个决策树/模型转换为另一个对齐(转录)
convert-ali [options] <old-model> <new-model> <new-tree> <old-alignments-rspecifier> <new-alignments-wspecifier>
convert-ali $alidir/final.mdl $dir/1.mdl $dir/tree "ark:gunzip -c $alidir/ali.JOB.gz|" "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1;
#为每个JOB创建一个fsts.JOB.gz,其中每个句子对应一个训练图,即 H o C o L o G (without transition-probabilities, by default)
compile-train-graphs [options] <tree-in> <model-in> <lexicon-fst-in> <transcriptions-rspecifier> <graphs-wspecifier>
compile-train-graphs $dir/tree $dir/1.mdl $lang/L.fst "ark:utils/sym2int.pl --map-oov $oov -f 2- $lang/words.txt < $sdata/JOB/text |" "ark:|gzip -c >$dir/fsts.JOB.gz" || exit 1;
while 不收敛 do
#给定基于GMM的模型(HCLG),对特征进行对齐,输出转录(以PDF_ID为单元).
gmm-align-compiled [options] <model-in> <graphs-rspecifier> <feature-rspecifier> <alignments-wspecifier> [scores-wspecifier]
gmm-align-compiled $scale_opts --beam=$beam --retry-beam=$retry_beam --careful=$careful
"$mdl" "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" "ark:|gzip -c >$dir/ali.JOB.gz"
#输入特征和转录,将其中的每一帧特征与一个转移(或高斯)对应起来
#输入<model-in>,读取其中的trans_model和am_gmm,再从trans_model中读取转移到transition_accs中,从am_gmm中读取所有的高斯到gmm_accs中;
#对<feature-rspecifier>中的每一帧,试图在<alignments-rspecifier>中找到对应的transition identifier,并写入到transition_accs中;
#将transition identifier在trans_model中找到对应的pdf_id,将这一帧以及这个pdf_id写入到gmm_accs中
#最后写入<stats-out>(先写入transition_accs,再写入gmm_accs)
gmm-acc-stats-ali [options] <model-in> <feature-rspecifier> <alignments-rspecifier> <stats-out>
gmm-acc-stats-ali $dir/$x.mdl "$feats" "ark,s,cs:gunzip -c $dir/ali.JOB.gz|" $dir/$x.JOB.acc || exit 1;
#基于GMM的声学模型的最大似然重估计, Do Maximum Likelihood re-estimation of GMM-based acoustic model
#将<stats-in>中的'特征-高斯'用于训练<model-in>中的一些高斯,当然有部分高斯没有被训练到.
#因此,输出一个occs(occupations,训练过的高斯占有数)用于表示哪些高斯被训练过了
gmm-est [options] <model-in> <stats-in> <model-out>
gmm-est --mix-up=$numgauss --power=$power --write-occs=$dir/$[$x+1].occs
$dir/$x.mdl "gmm-sum-accs - $dir/$x.*.acc |" $dir/$[$x+1].mdl || exit 1;
done#结束
# (保留最有鉴别性的特征维数)训练一个LDA对角矩阵变换,这个矩阵(变换)称为MLLT
# 可进行splice拼帧
# 因为每一步训练的模型都会导致状态的均值发生变换,而决策树是与状态的分布相关的。也就是说,旧的决策树就不适用于新训练的模型。因此,需要重新为新模型训练新的决策树(根据特征和新的alignment)。
numleaves:number of leaves,叶子数,决策树最后一次分裂后的叶子数,即三音素聚类后的三音素的数量
totgauss:total gauss,总混合高斯模型数,在gmm-est估计时刻加入此参数以更改目标混合高斯数,gmm-acc-stats-ali对<alignments-rspecifier>(来自ali.JOB.gz)以及<feature-rspecifier>进行统计,统计出各个混合高斯(hmm状态)对应的一些特征片段,将结果写入到$x.*.acc(即<stats-out>)中
流程:
- 使用特征和新的alignment,为新模型训练新的决策树;
- 由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);
- 使用新的决策树初始化GMM模型,并进行训练:
总共迭代n次,即重复n次:
对每一个utterance:
将对应的alignment与多个特征进行配对,生成.acc(与.egs类似)
使用.acc训练这段alignment中出现的所有GMM(.mdl)
当n=$realign_iters时:
使用G(alignment),与H(.mdl)、C(tree)、L(L.fst),生成HCLG图,用该图与对应的多个特征进行对齐,生成新的alignment(ali.JOB.gz)
当n=$mllt_iters时:
将对应的alignment与多个特征进行配对,生成.macc(与.acc类似)
使用.macc训练一个MLLT矩阵(.mat),用这个矩阵将GMM(.mdl)的均值进行降维,输出新的模型
迭代结束
numleaves totgauss data lang alidir dir
steps/train_lda_mllt.sh --cmd "$train_cmd" 2000 11000 data/train data/lang exp/tri1_ali exp/tri2b || exit 1;
numleaves totgauss data lang alidir dir
steps/train_mmi.sh --boost 0.05 data/train data/lang exp/tri2b_ali exp/tri2b_denlats exp/tri2b_mmi_b0.05 || exit 1;
data lang alidir denlatdir dir
steps/train_mpe.sh data/train data/lang exp/tri2b_ali exp/tri2b_denlats exp/tri2b_mpe || exit 1;
data lang alidir denlatdir dir
# 说话人自适应训练,即,使用fMLLR适应后的特征(经过fMLLR变换后的特征)进行训练
流程:
- 使用特征和新的alignment,为新模型训练新的决策树;
- 由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,调用convert-ali,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);
- 使用新的决策树初始化GMM模型,并进行训练:
总共迭代n次,即重复n次:
对每一个utterance:
将对应的alignment与多个特征进行配对,生成.acc(与.egs类似)
使用.acc训练这段alignment中出现的所有GMM(.mdl)
当n=$realign_iters时:
使用G(alignment),与H(.mdl)、C(tree)、L(L.fst),生成HCLG图,用该图与对应的多个特征进行对齐,生成新的alignment(ali.JOB.gz)
当n=$fmllr_iters时:
根据该utterance对应的特征、后验概率、所属说话人(utt2spk),对每个估计utterance一个fMLLR变换,将所有utterance的变换储存为(trans.JOB),对旧的特征进行fMLLR变换,生成的新的特征继续加入迭代,这意味着原始特征将经过${#fmllr_iters})个fMLLR变换。
迭代结束
因为使用了fMLLR变换过的特征进行训练GMM(.mdl),因此,输入到新模型中的特征(后续的训练和解码)都需要使用fMLLR变换。
steps/train_sat.sh --cmd "$train_cmd" 2500 15000 data/train data/lang exp/tri2b_ali exp/tri3b || exit 1;
numleaves totgauss data lang alidir dir
steps/train_quick.sh --cmd "$train_cmd" 4200 40000 data/train data/lang exp/tri3b_ali exp/tri4b || exit 1;
numleaves totgauss data lang alidir dir
Kaldi的BaseLine训练过程的更多相关文章
- 【AdaBoost算法】强分类器训练过程
一.强分类器训练过程 算法原理如下(参考自VIOLA P, JONES M. Robust real time object detection[A] . 8th IEEE International ...
- (原)torch的训练过程
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6221622.html 参考网址: http://ju.outofmemory.cn/entry/284 ...
- caffe绘制训练过程的loss和accuracy曲线
转自:http://blog.csdn.net/u013078356/article/details/51154847 在caffe的训练过程中,大家难免想图形化自己的训练数据,以便更好的展示结果.如 ...
- 深度残差网(deep residual networks)的训练过程
这里介绍一种深度残差网(deep residual networks)的训练过程: 1.通过下面的地址下载基于python的训练代码: https://github.com/dnlcrl/deep-r ...
- mxnet的训练过程——从python到C++
mxnet的训练过程--从python到C++ mxnet(github-mxnet)的python接口相当完善,我们可以完全不看C++的代码就能直接训练模型,如果我们要学习它的C++的代码,从pyt ...
- ubuntu14.04上实现faster rcnn_TF的demo程序及训练过程
安装环境:Ubuntu14.04.显卡Tesla K40C+GeForce GT 705.tensorflow1.0.0.pycharm5.0 说明:原文见博客园,有问题原文下留言,不定期回复.本文作 ...
- TensorFlow从1到2(七)线性回归模型预测汽车油耗以及训练过程优化
线性回归模型 "回归"这个词,既是Regression算法的名称,也代表了不同的计算结果.当然结果也是由算法决定的. 不同于前面讲过的多个分类算法或者逻辑回归,线性回归模型的结果是 ...
- 09 使用Tensorboard查看训练过程
打开Python Shell,执行以下代码: import tensorflow as tf import numpy as np #输入数据 x_data = np.linspace(-1,1,30 ...
- 深度学习基础(CNN详解以及训练过程1)
深度学习是一个框架,包含多个重要算法: Convolutional Neural Networks(CNN)卷积神经网络 AutoEncoder自动编码器 Sparse Coding稀疏编码 Rest ...
随机推荐
- 清流,获取点击的img路径
清流: <div style="clear:both"></div> 获取img的路径到TextBox3内: //获取展示的头像的集合var _heads ...
- C# Winform窗体基础属性
窗口样式: Inco:改图标样式: MaxmizeBox:true:显示右上角最大化按钮: MinmizeBox:true:显示右上角最小化按钮: ShowInco:true:显示左上角小图标: Sh ...
- B1016. 部分A+B
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编 ...
- 在Java中调用与系统有关的剪切板Clipboard
java从1.5版开始已经能与系统的剪切板很好的交互了. 如果可以在程序中直接调用系统的剪切板来保存“复制”的对象内容,那可以说的比之前的想法好很多. 下面是一个对java.io.File对象进行co ...
- python面向对象中的一些特殊__方法__
1. __doc__ 表示类的描述信息 class Foo: """ 描述类信息""" def func(self): pass print ...
- binutils安装
mkdir /tools/binutils -p //新建一个安装目录 .configure prefix=/tools/binutils make make install binutils工具就安 ...
- python机器学习-sklearn挖掘乳腺癌细胞(三)
python机器学习-sklearn挖掘乳腺癌细胞( 博主亲自录制) 网易云观看地址 https://study.163.com/course/introduction.htm?courseId=10 ...
- xgboost使用调参
欢迎关注博主主页,学习python视频资源 https://blog.csdn.net/q383700092/article/details/53763328 调参后结果非常理想 from sklea ...
- MHA环境搭建
准备工作 数据库架构 角色 ip地址 主机名 server_id Master Slave1 Slave2 配置三台服务器ssh免秘钥认证 ssh-keygen -t rsa ssh-copy-id ...
- composer 更换国内镜像源
使用 Composer 镜像加速有两种选项: 选项一:全局配置,这样所有项目都能惠及(推荐):选项二:单独项目配置: 选项一.全局配置(推荐) $ composer config -g repo.pa ...