sid/nnet3/xvector/get_egs.sh

x-vector   sid/nnet3/xvector/get_egs.sh 由特征到网络输入

x-vector模型训练的脚本是nnet3bin/nnet3-train.cc

该脚本的调用方式是 Usage:  nnet3-train [options] <raw-model-in> <training-examples-in> <raw-model-out>

该脚本训练模型的方式是从一个文件(<training-examples-in>)中依次读取一个NnetExample对象进行训练迭代,所以如何有已有的mfcc特征构造出NnetExample对象? 

在执行nnet3-train.cc 的log中关于egs的输入分别调用三个bin,分别是 nnet3-copy-egs,nnet3-shuffle-egs,nnet3-merge-egs。前两个脚本是复制和打乱顺序,网络的输入关键是nnet3-merge-egs, 这个merge就是将多个(minibatch个)NnetExample合并成一个.

所以网络的输入构造分为两步

1. 将一个utt对应mfcc特征,标签,转换为一个NnetExample

2. 将多个NnetExample实体合并成一个NnetExample对象

每个utt对应着mfcc特征和说话人id(将字符串映射成数字,0至num_speaker-1,便于构成网络输出标签),

每个utt可以构造一个NnetExample对象。这个构造过程是有脚本 sid/nnet3/xvector/get_egs.sh产生

产生的过程是第一,由sid/nnet3/xvector/allocate_egs.py 产生range文件,然后range文件作为nnet3bin/nnet3-xvector-get-egs.cc的输入,然后产生NnetExample文件。

现在有训练集feats.scp 用此产生range 文件, feats.scp包含很多utt对应的mfcc,会产生多个 egs 文件,具体多少个,控制方式如下,在get_egs.sh的参数中有一个参数--frames-per-iter 1000000000这个参数字面含义是每轮迭代的帧数,每次迭代训练的输入是一个完整的 egs 文件,所以可以理解为每个egs文件包含的总帧数,假设feats.scp包含M帧,每个egs文件大概N帧,则会产生M/N + 1 个ges文件.

 而allocate_egs.py产生的range文件的个数是有nj决定的但nj应该小于等于egs文件个数,然后用nj个进程调用nnet3-xvector-get-egs.cc输入range产生egs文件。

将这么多utt分到不同的egs文件里,就需要一个标志来指定某个utt属于第几个range文件,这个标志位于range文件的第三列,

有range文件产生egs(NnetExample)文件时,调用的nnet3-xvector-get-egs.cc 可以有多个输出,调用方式如下。

Usage: nnet3-xvector-get-egs [options] <ranges-filename> <features-rspecifier>

<egs-0-out> <egs-1-out> ... <egs-N-1-out>

可以看出这个脚本可以有多个输出,假设现在要产生5个egs文件,而进程数量是2,此时每个进行就会产生多个egs文件,此时仅仅指定一个utt属于第几个egs文件还不够,还需要指定这个utt在某个进程中输出至第几个egs文件,这个标志位于range文件第二列,如果用10个进程产生10个egs文件,每个进程只产生一个,这个标志就全部为0. 综上所述,range文件的第二第三列只是确定一个utt产生的NnetExample位于第几个egs文件,与如何产生NnetExample无关。

在get_egs.sh的参数中有两个参数 --min-frames-per-chunk 200 ,--max-frames-per-chunk 400 调用这个脚本之前,会先删除帧数小于max-frames-per-chunk 的utt。 在产生egs的时候,并不是用的所有mfcc特征,而只是截取其中的部分,而截取的长度则是在这两个参数之间的随机数,截取的起始位置则又是另一个随机数,令在max-frames-per-chank和min-frames-per-chunk之间的随机数为random-length,假设需要产生10个egs文件,则每个文件对应一个random-length,每个文件的random-length都是随机的,几乎不同,所以由一个utt产生一个NnetExample时,还需要指定这个utt对应的random-length,该标志位于range文件的第5列。

假设一个utt帧长num_rows截取的mfcc长度为random-length,则起始位置是在0-(num_rows - random-length)之间的随机数,这个随机数就是截取mfcc的起始位置,这个标志位于range文件的第4列,所以range文件的第4第5列决定了截取mfcc的子矩阵。

由于range文件中的第一列标志utt可能会重复,所以在构成egs文件时,utt标记改为 utt + "-" + 第四列 + "-" + 第五列 + "-" + 第六列构成NnetExample的标记,与训练并无联系,

range文件的最后一列为spk-id构成网络的输出,假设整个训练有N个人,则某个utt对应的网络输出就是一个N维的0-1向量,对应spk-id的值为1

一个NnetExample只包含一个属性 vector< NnetIo >,由utt产生NnetExample的过程,会生成两个NnetIo对象,然后这两个对象存在vector< NnetIo>中,这两个对象分别称为input_NnetIo 和 output_NnetIo, 分别对应着网络的输入特性和输出标签。

struct NnetIo {

std::string name;

std::vector<Index> indexes;

GeneralMatrix features;

}

两个NnetIo的name分别为"input" , "output" ; features分别是mfcc子矩阵,标签矩阵(一维,有稀疏矩阵生成)

假设子矩阵的帧长为M,则 input_NnetIo 的indexes为:

n 0 0 0 ... 0

t 1 2 3 ... M

x 0 0 0 ... 0

output_NnetIo的indexes为:<n,t,x> = <0,0,0>

目前有utt产生产生NnetExample已经完成,接下来是NnetExample的合并,在模型训练的时候,会首先将--minibatch-size=64数量的NnetExample进行合并,NnetExample的合并本质上就是NnetIo的合并,input_NnetIo的合并为 name仍然为"input",因为所有的NnetIo的name都一样,features是矩阵,合并后的结果就是64个句子的拼接,indexes的合并也相当于拼接,只不过n表示这个utt在合并的这个批次中的索引,最终形式为

n 0 0 0 ... 0 1 1 1 ... 1 2 2 2 ... 2 ... ... 63 63 63 ... 63

t 1 2 3 ... M 0 1 2 ... M 0 1 2 ... M ... ...  0  1  2 ... M

x 0 0 0 ... 0 0 0 0 ... 0 0 0 0 ... 0 ... ...  0  0  0 ... 0

output_NnetIo 合并类似,也是简单的拼接,index的n指定合并批次的索引。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容