如何在Keras模型中计算打印皮尔逊相关系数作为自定义训练指标
Keras 训练时输出预测值与真实值皮尔逊相关系数的实现方法
你只需要编写符合Keras指标规范的自定义计算函数,传入model.compile()的metrics参数即可,Keras会自动在每个epoch结束后计算训练集、验证集的对应指标,打印到训练日志中。
具体实现步骤
- 编写皮尔逊相关系数计算函数,注意必须使用Keras后端的张量运算接口,不能直接用numpy计算,否则无法兼容Keras的计算图模式与GPU加速,同时要加极小值避免除0错误:
from tensorflow import keras import tensorflow as tf def pearson_correlation(y_true, y_pred): # 极小值,避免分母为0出现NaN epsilon = 1e-7 # 计算真实值、预测值的均值 y_true_mean = keras.backend.mean(y_true) y_pred_mean = keras.backend.mean(y_pred) # 计算协方差项 cov = keras.backend.sum((y_true - y_true_mean) * (y_pred - y_pred_mean)) # 计算两个变量的标准差乘积 std_true = keras.backend.sqrt(keras.backend.sum(keras.backend.square(y_true - y_true_mean))) std_pred = keras.backend.sqrt(keras.backend.sum(keras.backend.square(y_pred - y_pred_mean))) # 返回皮尔逊相关系数结果 return cov / (std_true * std_pred + epsilon)
- 修改函数的显示名称,让日志输出的字段名和你预期的一致,再传入模型编译参数即可:
# 修改指标在日志中显示的名称 pearson_correlation.__name__ = "pearson correlation" model = keras.Sequential([...]) # 你原有定义的模型层 model.compile( optimizer="adam", loss="mse", # 替换为你实际使用的回归损失函数 metrics=[pearson_correlation] ) # 正常调用fit即可,开启验证集时会自动输出验证集的皮尔逊系数(前缀为val_) model.fit( X, y, validation_split=0.2 # 按你的需求配置验证集参数 )
运行效果
配置完成后训练日志会自动输出对应指标,格式和你预期的完全一致:
50261/50261 [==============================] - 100s 2ms/step - loss: 20.6613 - pearson correlation: 0.62 - val_loss: 13.3205 - val_pearson correlation: 0.56
注意事项
- 如果你使用Keras 3多后端版本,可以把代码中
keras.backend替换为keras.ops,即可兼容TensorFlow、PyTorch、JAX三种后端 - 如果你的预测值或真实值存在全零/常数的极端情况,epsilon参数可以避免计算出现NaN值
- 自定义指标不需要手动做张量转换,Keras会在训练、验证阶段自动把对应批次的真实值、预测值传入函数计算,整个epoch的指标会自动做批次聚合
内容的提问来源于stack exchange,提问作者Varun Gupta
相关产品推荐
相关产品推荐

