替换recognize.py文件中cuda() --> cpu(),预测过程不需要调用GPU,虽然慢一点,但是在GPU紧张的时候也可以进行预测,将GPU资源尽量留给训练过程。
在预测过程中,可以加入report.py相关代码,即首先报告模型总参数情况。
model.load_state_dict(net['state_dict'])
num_params = 0
for param in model.parameters():
# print(param)
print(param.size())
num_params += param.numel()
print(num_params / 1e6)
# print(model.parameters())
print(num_params)
total_params = sum(x.data.nelement() for x in model.parameters())
print('Args: {}'.format(args))
print('Model total parameters: {}'.format(total_params))
输入权重的维度,encoder.linear_in.weight [256, 560] (其中256为d_model,560为 d_input * LFR_m,即80 x 7)
encoder模块w_qs权重维度,encoder.layer_stack.0.slf_attn.w_qs.weight[512, 256](其中512为d_k/d_v * n_head,即64 x 8)
新增 "--" 变量配置,在. utils/parse_options.sh || exit 1;这行命令之前定义一个变量并赋值。
此处不能用save-folder="",会报找不到对应目录的错误,可能这个变量已经被定义?
将 "-" 改为 "_",用save_folder=""即可。
然后在所有原有 save_folder/目录。
这样即可在shell脚本选项配置中加入--save_folder,直接指定其他地方的模型结果绝对路径了。便于预测多种不同结果。
关于LFR_m、LFR_n参数的理解
上图中FRAME即为一帧,其为语音经过FBANK特征提取之后,mel滤波器为80个。
正常训练过程中,每次输入一帧数据进行处理,而当LFR_m = 5,即每次输入5帧数据进行处理;而当LFR_n = 4时,说明第二次输入的5帧数据在第一次输入的5帧数据基础上跳过4帧,即两次会有1帧数据重叠。
那么按照此理解推测:
LFR_m = 1; LFR_n = 1 与正常训练过程一致,每次输入一帧数据,每次输入数据无重叠
LFR_m = 2; LFR_n = 2 每次输入2帧数据, 每次输入数据无重叠
LFR_m = 1; LFR_n = 2 每次输入1帧数据,算上前一帧数据,跳过2帧数据,相当于漏掉一半帧
LFR_m = 7; LFR_n = 6 每次输入7帧数据,算上前一帧数据,跳过6帧数据,相当于每次重叠1帧