Keras指标异常:训练时SNR与手动计算结果不符问题咨询
核心原因分析与解决方法
1. 手动计算时参数传入错误
你的语音去噪任务中,训练时Keras计算SNR指标的逻辑是:将**干净信号S_test_01_abs.T作为clean_signal,模型预测结果作为recovered_signal传入calculate_snr。但从你给出的代码看,手动计算时误将带噪信号X_test_01_abs.T**当成了干净信号传入函数,这直接导致计算逻辑和训练时完全不一致,结果自然差异巨大。
修正后的手动计算代码:
calculate_snr(S_test_01_abs.T, model.predict(X_test_01_abs.T))
2. Keras指标计算逻辑与全局计算的差异
你的calculate_snr函数是对输入的整个张量求和计算SNR,但Keras在训练/验证阶段会按batch逐一计算指标,再将所有batch的结果取平均,作为整个epoch的指标值。而你手动计算是直接对整个验证集全局求和,两种计算方式的结果通常不会一致(尤其是当不同batch的SNR波动较大时)。
验证该问题的代码:
import numpy as np batch_size = 100 val_x = X_test_01_abs.T val_y = S_test_01_abs.T preds = model.predict(val_x) snr_list = [] # 按训练时的batch_size拆分验证集,逐个计算batch的SNR for i in range(0, len(val_x), batch_size): batch_clean = val_y[i:i+batch_size] batch_pred = preds[i:i+batch_size] batch_snr = calculate_snr(batch_clean, batch_pred).numpy() snr_list.append(batch_snr) # 计算batch SNR的平均值,该结果应与训练时的验证集SNR接近 avg_snr = np.mean(snr_list) print(avg_snr)
额外排查点:模型模式差异
如果你的模型包含Dropout、BatchNormalization等层,Keras在model.fit的验证阶段会自动切换到评估模式(关闭Dropout、使用移动平均统计量),model.predict同样默认使用评估模式,所以这个因素通常不会导致差异。若手动修改过模型训练状态,可手动切换模式后再预测:
# 手动切换到评估模式 model.trainable = False preds = model.predict(val_x) model.trainable = True
内容的提问来源于stack exchange,提问作者Tony_stark
相关产品推荐
相关产品推荐

