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. A1011. World Cup Betting

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  2. 【洛谷P3901】数列找不同

    题目大意:给定一个长度为 N 的序列,每个点被染了一个颜色.现有 M 个询问,每个询问查询区间 [l,r] 内的点是否颜色都是不同的. 题解:莫队裸题. 直接维护区间颜色数,用 cnt[] 记录下区间 ...

  3. Nginx概述及安装配置

    1.概述 Nginx是一款开源的,高性能的Http和反向代理服务器,同时也是一个IMAP.POP3.SMTP代理服务器:Nginx可以作为一个HTTP服务器进行网站的发布处理,也可以作为反向代理进行负 ...

  4. JavaScript的函数声明与函数表达式的区别

    1)函数声明(Function Declaration); // 函数声明 function funDeclaration(type){ return type==="Declaration ...

  5. 新建工程时报错(26, 13) Failed to resolve: com.android.support:appcompat-v7:28.+ ,

    allprojects { repositories { jcenter() maven { url "https://maven.google.com" } } }

  6. 100.Same Tree(E)

    100. same tree 100. Same Tree Given two binary trees, write a function to check if they are the same ...

  7. Oracle提权

    1.创建JAVA包 select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immed ...

  8. Shell 同步时间脚本

    Linux系统同步时间脚本 Linux操作系统,如果时间和网络时间差距太大的话.可能会导致程序,进程启动不了.所以linux系统时间同步显得尤为重要,本文在借鉴网上众多资料后,以centos_6.X系 ...

  9. POJ3662 SPFA//二分 + 双端队列最短路

    https://cn.vjudge.net/problem/12427/origin 题意:求1到N第K + 1大条边权最小的路径 首先想到dp递推,dp[x][y]表示到x这个点经过y条免费边的最小 ...

  10. NoClassDefFoundError com/google/inject/Injector

    一个maven项目莫名其妙的遇上了NoClassDefFoundError com/google/inject/Injector,在maven-surefire-plugin插件中配置 了<fo ...