一、batch_frames 参数设置
为了更方便测试batch_frames参数的设置,训练之前,将第3步单独写为train.sh文件,并将训练、开发集的json做些精简:
原始训练集:120098条语音 精简后: 9条语音
原始开发集:14326条语音 精简后:10条语音
训练集 9条语音:
开发集 10条语音:
由于train.sh调试不方便,改用单独调试train.py程序,LFR_m设置为1,LFR_n设置为1,此时frames数与原始语音一致。
先将batch_frames 设置为 1000
src/data/data.py程序中设置调试断点
开始调试,将total_frames、minibatch添加到观察点
单步执行,9条语音的训练集,按照frames数从大到小排序,依次读入total_frames,所以最先读入的是BAC009S0002W0129,frames数为612;
此时total_frames(当前为612) < batch_frames(当前设置为1000),所以需要继续读入下一条语音BAC009S0002W0122,frames数为598,即total_frames = 612 + 598 = 1210
执行下一条指令后,由于total_frames(当前为1210) > batch_frames(当前设置为1000),minibatch中放入2条语音BAC009S0002W0129、BAC009S0002W0122,作为minibatch的第0批。
继续运行程序,由于数据集还未结束,重新进入while内,total_frames被清0
再次读入BAC009S0002W0127,frames数为587
以此类推,将BAC009S0002W0127、BAC009S0002W0124读入minibatch的第1批
minibatch第3批包含: 411 + 385 + 337 = 1133
BAC009S0002W0130 411
BAC009S0002W0123 385
BAC009S0002W0128 337
最终minibatch的批次数为 4,反应到训练log文件中Iter的个数。(此处print-freq设置为1)
下图中,Valid Summary为开发集中的批次,刚好也是4
将batch_frames 设置为 500
LFR_m,LFR_n,batch_frames不同条件下,资源占用情况:
m=4 n=3 bf=1500
Train Iter 31241 Valid Iter 3741 GPU Memory ? MiB
m=4 n=3 bf=3000
Train Iter 16701 Valid Iter 2001 GPU Memory ? MiB
m=4 n=3 bf=5000
Train Iter 10301 Valid Iter 1201 GPU Memory 4281 MiB
m=4 n=3 bf=10000
Train Iter 5201 Valid Iter 601 GPU Memory 7377 MiB
m=4 n=6 bf=10000
Train Iter 5201 Valid Iter 601 GPU Memory 3535 MiB
m=4 n=6 bf=20000
Train Iter 2601 Valid Iter 301 GPU Memory 4957 MiB
m=1 n=6 bf=20000
Train Iter 2601 Valid Iter 301 GPU Memory 4877 MiB
m=1 n=6 bf=30000
Train Iter 1701 Valid Iter 201 GPU Memory 6831 MiB
总结:
1、batch_frames设置与batch_size区别在于对语音的frames个数进行批量化。
2、语音数据集进行排序之后依次累加frames个数,如果超过batch_frames设置值,则将读入的语音作为一个批次,对应训练过程中的一个Iter,一次epoch即遍历一次数据集。
3、如果修改LFR_m,LFR_n的值,会改变总的 frames 数以及 Iter 数,即低帧率特征化提取。