You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:47:05