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>)中

流程:

  1. 使用特征和新的alignment,为新模型训练新的决策树;
  2. 由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);
  3. 使用新的决策树初始化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变换后的特征)进行训练

流程:

  1. 使用特征和新的alignment,为新模型训练新的决策树;
  2. 由于决策树改变,音素的聚类(pdf)也发现改变,因此由旧的音素的聚类(pdf)组成的alignment也需要改变。使用旧模型、新模型、新决策树,调用convert-ali,将旧的alignment(由pdf组成)转换为新的alignment(由新pdf组成);
  3. 使用新的决策树初始化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训练过程的更多相关文章

  1. 【AdaBoost算法】强分类器训练过程

    一.强分类器训练过程 算法原理如下(参考自VIOLA P, JONES M. Robust real time object detection[A] . 8th IEEE International ...

  2. (原)torch的训练过程

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6221622.html 参考网址: http://ju.outofmemory.cn/entry/284 ...

  3. caffe绘制训练过程的loss和accuracy曲线

    转自:http://blog.csdn.net/u013078356/article/details/51154847 在caffe的训练过程中,大家难免想图形化自己的训练数据,以便更好的展示结果.如 ...

  4. 深度残差网(deep residual networks)的训练过程

    这里介绍一种深度残差网(deep residual networks)的训练过程: 1.通过下面的地址下载基于python的训练代码: https://github.com/dnlcrl/deep-r ...

  5. mxnet的训练过程——从python到C++

    mxnet的训练过程--从python到C++ mxnet(github-mxnet)的python接口相当完善,我们可以完全不看C++的代码就能直接训练模型,如果我们要学习它的C++的代码,从pyt ...

  6. ubuntu14.04上实现faster rcnn_TF的demo程序及训练过程

    安装环境:Ubuntu14.04.显卡Tesla K40C+GeForce GT 705.tensorflow1.0.0.pycharm5.0 说明:原文见博客园,有问题原文下留言,不定期回复.本文作 ...

  7. TensorFlow从1到2(七)线性回归模型预测汽车油耗以及训练过程优化

    线性回归模型 "回归"这个词,既是Regression算法的名称,也代表了不同的计算结果.当然结果也是由算法决定的. 不同于前面讲过的多个分类算法或者逻辑回归,线性回归模型的结果是 ...

  8. 09 使用Tensorboard查看训练过程

    打开Python Shell,执行以下代码: import tensorflow as tf import numpy as np #输入数据 x_data = np.linspace(-1,1,30 ...

  9. 深度学习基础(CNN详解以及训练过程1)

    深度学习是一个框架,包含多个重要算法: Convolutional Neural Networks(CNN)卷积神经网络 AutoEncoder自动编码器 Sparse Coding稀疏编码 Rest ...

随机推荐

  1. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  2. 高DPI下界面错乱的解决方法和原理

    来源: http://bbs.csdn.net/topics/370177760 我在win32 + c写的界面中解决办法,就是把字体的字号给固定了,这样做的结果就是,不管dpi是否有改变,界面中控件 ...

  3. MySQL表结构的优化和设计

    仅供自己学习   结论写在前面: 1.给字段选取最合适的数据类型 2.数据类型的宽度尽可能的小 3.给where条件的字段设置索引 4.允许部分数据冗余 5.字段要尽可能的设置为not null,特别 ...

  4. eclipse中如何复制用点分隔的全类名

    结果: com.xxx..redis.service.JedisClient

  5. C实现读写文件

    https://www.cnblogs.com/zhanghongfeng/p/7726199.html https://www.cnblogs.com/xudong-bupt/p/3478297.h ...

  6. fiddler接口测试,js代码修改日志展示(埋点用)

    fiddler 通过fiddler 发送接口信息: http://blog.csdn.net/java2013liu/article/details/53380381 rules--automatic ...

  7. (LIS) P1091 合唱队形 洛谷

    题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他 ...

  8. (贪心 部分背包问题)悼念512汶川大地震遇难同胞——老人是真饿了 hdu2187

    悼念512汶川大地震遇难同胞——老人是真饿了 http://acm.hdu.edu.cn/showproblem.php?pid=2187 Time Limit: 1000/1000 MS (Java ...

  9. 微信小程序:下拉刷新

    下拉刷新 1.需要在json文件中,设置"enablePullDownRefresh": true,表示该页面使用下拉刷新 2.在微信内置函数onPullDownRefresh中进 ...

  10. M1-Flask-Day3

    内容概要: websocket mysql连接池 sqlalchemy flask-sqlalchemy 练习: 1. 谈谈Flask和Django的认识? Django大而全的框架,把Web相关设计 ...