TensorFlow中如何按指定公式组合多个加权损失函数
TensorFlow Keras 加权组合损失实现方案
报错原因
针对输出层为单个sigmoid激活神经元(输出值范围0~1)的CNN模型计算组合损失时,直接对MeanAbsoluteError、MeanSquaredError的类实例做加法、数乘操作会抛出如下类型错误:
TypeError: unsupported operand type(s) for +: 'MeanAbsoluteError' and 'MeanSquaredError'
本质原因是Keras内置的损失类实例本身不支持直接算术运算,只有传入真实标签、模型预测值调用实例后,返回的损失计算结果为张量类型,才支持加权、求和等算术操作。
实现代码
自定义符合Keras损失接口规范的函数即可,函数入参固定为y_true(真实标签)、y_pred(模型预测输出),在函数内部完成单损失计算、加权求和,返回最终组合损失:
import tensorflow as tf # 配置损失权重 l_1 = 0.6 l_2 = 0.4 def weighted_combined_loss(y_true, y_pred): mae = tf.keras.losses.MeanAbsoluteError()(y_true, y_pred) mse = tf.keras.losses.MeanSquaredError()(y_true, y_pred) return l_1 * mae + l_2 * mse
模型编译
自定义损失函数可直接传入model.compile()的loss参数,和内置损失的使用方式完全一致:
model.compile( optimizer=opt, loss=weighted_combined_loss, metrics = ['accuracy', sensitivity, specificity, tf.keras.metrics.RootMeanSquaredError(name='rmse')] )
注意事项
- 模型输出经过sigmoid激活后值域为01,需确保训练所用真实标签也缩放到01区间,避免损失计算出现量级偏差。
- 若需要调整损失归约逻辑(如按样本求和、按批次平均),可在实例化损失类时传入
reduction参数配置。
内容的提问来源于stack exchange,提问作者Jimut123
相关产品推荐
相关产品推荐

