1.cmd=“queue.pl -q all.q” && gpu_cmd=“queue.pl -q g.q”
使用sge集群,制定所使用的sge集群的queue为all.q, 一般all.q 会包含所有的主机
queue.pl -q g.q, 使用GPU
https://blog.csdn.net/huchad/article/details/52189726
https://blog.csdn.net/boyStray/article/details/89046837
2. nj=1
nj是看有几批
https://blog.csdn.net/eqiang8848/article/details/89552963
神经网络搭建及训练相关参数
3. chunk_size是什么
Chunk的大小是我们在训练或解码中每个数据块所含(输出)帧的数量。在get_egs.sh和train_dnn.py脚本中,chunk-size的也被称为frames-per-eg(在某些上下文中,这与块大小不同;见下文)。在解码中,我们把它称为frame-per-chunk。
https://www.cnblogs.com/JarvanWang/p/10145897.html
3.1 chunk_width是什么
–egs.chunk-width
egs(examples)中每个chunk包含的帧数。注意:如果将值翻一番,则应将"–trainer.samples-per-iter"值折半。
https://www.cnblogs.com/JarvanWang/p/10145897.html
3.2 samples-per-iter是什么
–trainer.samples-per-iter
每个ark(archive,档案)中包含的egs(examples,样本)数。每个eg(example,样本)包含’chunk_width’个帧。
chunk_width=20、samples_per_iter=20000时;相当于训练普通DNN时每次迭代使用20*20000=400000帧。
https://www.cnblogs.com/JarvanWang/p/10145897.html
4. left_context_initial=-1 & right_context_final=-1
在版本5.1和更高版本中,您可以指定extra-left-context-initial和extra-right-context-final,允许话语的开始/结束具有不同的上下文量。如果您指定这些值,通常将它们都指定为0(即没有额外的上下文)。但是,为了与旧版本兼容,它们通常默认为-1(意思是复制默认的左上方和右上方)。
https://www.cnblogs.com/JarvanWang/p/10145897.html
5. eg是什么
example, /eg-/, 样例,样本,可用其IPA音标"eg"来作为其缩写;在传统的语音识别中,一个example,即一帧以及标签的二元组(frame, label)。
egs,多个eg,多个样本。
对于不使用上下文帧以及任何时间信息的DNN,如以Sigmoid、Tanh、ReLu为神经元的DNN。
组合为一个块,即chunk,使得这些帧能共享左右上下文帧:
8帧,总共需要20帧的左右上下文
chunk与egs的区别:
chunk:[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
eg:[0, 1, 2, 3, 4, 5, 6, 7]
即:chunk是显式包含左右上下文帧的eg
https://www.cnblogs.com/JarvanWang/p/10145897.html
6. chunk_left_context是什么
若以帧为单位进行LSTM的训练,一整句话的所有帧能不断地在神经网络中进行前向传播;
若以chunk为单位将一个语句进行切分,除一句话的第一个chunk外, 其余chunk的第一帧均无法获取到上一帧(位于上一个chunk)的细胞记忆Ct-1和细胞输出ht-1。
为了解决这一问题,将chunk-left-context数的帧输入到LSTM中,以最大程度地近似上一个chunk最后一针对应的细胞记忆Ct-1和细胞输出ht-1。
https://www.cnblogs.com/JarvanWang/p/10145897.html
7. Minibatch大小
nnet3-merge-egs将各个训练样本合并到包含许多不同样本的minibatch中(每个原始样本获得不同的’n’索引)。 minibatch-size是minibatch的大小,指的是:将多个样本的帧以及label组合为一个样本,即eg的数量;
https://www.cnblogs.com/JarvanWang/p/10145897.html
8. 相关网页
脚本注释:https://www.cnblogs.com/welen/p/7521723.html
声学模型部分翻译:https://sourceforge.net/p/kaldichina/mailman/kaldichina-users/
num_archives相关:https://blog.csdn.net/eqiang8848/article/details/89552963 ???
特征提取FBank:https://blog.csdn.net/wxb1553725576/article/details/78048546
kaldi会议记录:https://wenku.baidu.com/view/7ba36d21804d2b160a4ec00f.html
Kaldi的nnet2 Component:https://www.cnblogs.com/JarvanWang/p/7499600.html
9. num_jobs_initial= & num_jobs_final=
chain注意事项:
如果只有单个gpu ,需要将num-jobs-initial和num-jobs-final都设为1,这个效果将比把num-chunk-per-minibatch改为很小值效果更好。这些参数的改变都可能会影响结果,如果将num-jobs-initial和num-jobs-final都设为1,建议将epochs改为原来的2/3。
train_stage可以改为从报错的迭代次数开始。
选择ReLu激活函数的话,调参数时需要注意设定的学习速率,不要让过多的神经元处于ReLu函数左边额死亡状态。
通常在解码中使用的默认声学权重(0.1)是不恰当的 - 对于chain模型,最佳声学权重接近于1。因此,我们脚本steps/nnet3/decode.sh中将选项-acwt默认设定为1.0。
有效学习率等价的看成学习率除以任务数。
local/chain/run_tdnn.sh:
30 initial_effective_lrate=0.001
31 final_effective_lrate=0.0001
白总说:用默认的就可以了,训练发现initial-jobs 和final-jobs弄成一样,也没啥区别。默认的效果可以
训练的trick:https://shiweipku.gitbooks.io/chinese-doc-of-kaldi/content/dan_dnn.html
原文:https://blog.csdn.net/eqiang8848/article/details/89552963
10. apply-cmvn
apply-cmvn --utt2spk=ark:${data_dir}/utt2spk scp:${data_dir}/cmvn.scp scp:${data_dir}/feats.scp ark:${mfcc_dir}/after-cmvn.ark || exit 1
首先这个是一个feats变量定义,这个变量作为后续其他命令的参数,这个主要处理特征数据的。
这里用到了两个kaldi函数,apply-cmvn 和 add-deltas
apply-cmvn 的输入3个文件:
–utt2spk=ark:sdata/JOB/utt2spk语料和录音人员关联文件scp:sdata/JOB/utt2spk语料和录音人员关联文件scp:sdata/JOB/cmvn.scp 说话人相关的均值和方差
scp:$sdata/JOB/feats.scp 训练用特征文件
对feats.scp做归一化处理
输出是 ark:-|,利用管道技术把输出传递给下一个函数作为输入
add-deltas 输入是ark:-,表示把上一个函数的输出作为输入(实际上就是整个训练特征数据),
输出 ark:- | 管道技术同上。训练数据增加差分量,比如13维度mfcc处理后变成39维度
这样的输入输出重定向和管道技术后续使用非常多,所先熟练掌握linux shell的语法。
原文:https://blog.csdn.net/fandaoerji/article/details/50262969
11. 神经网络
input dim=`feat-to-dim scp:$data_dir/feats.scp -` name=input
conv-relu-renorm-layer name=conv1 height-in=32 height-out=16 height-subsample-out=2 num-filters-out=16 height-offsets=-2,-1,0,1,2 time-offsets=-2,-1,0,1,2 required-time-offsets=-2,-1,0,1,2
conv-relu-renorm-layer name=conv2 height-in=16 height-out=16 height-subsample-out=1 num-filters-out=8 height-offsets=0 time-offsets=0 required-time-offsets=0
fast-lstm-layer name=lstm1 cell-dim=${lstm_dim} delay=-2 decay-time=${lstm_decay}
relu-renorm-layer name=tdnn2 input=Append(-4,-2,0) dim=${tdnn_dim}
fast-lstm-layer name=lstm2 cell-dim=${lstm_dim} delay=-4 decay-time=${lstm_decay}
relu-renorm-layer name=tdnn3 input=Append(-8,-4,0) dim=${tdnn_dim}
fast-lstm-layer name=lstm3 cell-dim=${lstm_dim} delay=-8 decay-time=${lstm_decay}
relu-renorm-layer name=tdnn4 input=Append(-16,-8,0) dim=${tdnn_dim}
output-layer name=output include-log-softmax=true dim=3 learning-rate-factor=0.1 input=tdnn4
input 输入层 dim 输入维度 name 层的名称,在网络中定义的名称
conv-relu-renorm-layer 卷积层 name 卷积层名称 height-in 输入卷积核的长 height-out 输出卷积核的长 num-filters-out 输出卷积核的数量 height-offsets=-2,-1,0,1,2 time-offsets=-2,-1,0,1,2 required-time-offsets=-2,-1,0,1,2
fast-lstm-layer fastlstm name
relu-renorm-layer name=tdnn input=Append(-4,-2,0) 输入三个帧 0表示当前帧 -2表示向左隔两个的帧,-4表示向左隔四个的帧
【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络: https://cloud.tencent.com/developer/article/1020450
Kaldi nnet3的fastlstm与标准LSTM: https://www.cnblogs.com/JarvanWang/p/10183485.html
神经网络-CNN结构和语音识别应用:https://blog.csdn.net/xmdxcsj/article/details/54695995
语音识别kaldi该如何学习?: https://www.zhihu.com/question/65516424/answer/265297686
机器学习与人工智能技术分享(未完待续):https://www.zybuluo.com/vivounicorn/note/446479
12. xconfig_to_configs.py
steps/nnet3/xconfig_to_configs.py --xconfig-file $dir/configs/network.xconfig --config-dir $dir/configs/
将写好的神经网络信息转换为config文件,同时向$dir/configs/vars写入信息
13. steps/nnet3/train_raw_rnn.py脚本调用参数说明
steps/nnet3/train_raw_rnn.py --stage=$train_stage \ # 控制代码块的运行,方便调试
--feat.cmvn-opts="--norm-means=false --norm-vars=false" \
--egs.chunk-width=$chunk_width \
--egs.dir=${egs_dir} \
--egs.stage=$get_egs_stage \
--egs.chunk-left-context=${chunk_left_context} \
--egs.chunk-right-context=${chunk_right_context} \
--egs.chunk-left-context-initial=0 \
--egs.chunk-right-context-final=0 \
--trainer.num-epochs=$num_epochs \ # 训练轮数
--trainer.samples-per-iter=$samples_per_iter \
--trainer.optimization.num-jobs-initial=$num_jobs_initial \
--trainer.optimization.num-jobs-final=$num_jobs_final \
--trainer.optimization.initial-effective-lrate=$initial_effective_lrate \
--trainer.optimization.final-effective-lrate=$final_effective_lrate \
--trainer.optimization.shrink-value=0.99 \
--trainer.dropout-schedule="$dropout_schedule" \
--trainer.rnn.num-chunk-per-minibatch=128,64 \
--trainer.optimization.momentum=0.5 \
--trainer.deriv-truncate-margin=10 \
--trainer.max-param-change=$max_param_change \
--trainer.compute-per-dim-accuracy=true \
--cmd="$gpu_cmd" --nj 40 \ # cmd设置内存管理,nj设置进程数
--cleanup=true \ # 是否清除网络配置信息
--cleanup.remove-egs=$remove_egs \
--cleanup.preserve-model-interval=10 \
--use-gpu=true \ # 是否使用GPU
--use-dense-targets=true \ # 是否使用稠密目标
--feat-dir=$data_dir \ # 特征目录
--targets-scp="$targets_dir/targets.scp" \
--egs.opts="--frame-subsampling-factor 2 --num-utts-subset $num_utts_subset" \
--dir=$dir || exit 1