在TensorFlow Keras中如何引用ground truth变量定义自定义损失?
解决方案
核心思路:将ground truth作为额外输入接入模型
Keras的add_loss只能引用模型计算图中存在的张量,默认情况下训练时传入的标签不会直接作为图节点暴露给自定义损失,所以你需要把y1_true定义为额外的输入层,在训练、预测时对应传入值即可。
具体实现代码示例:
import tensorflow as tf from tensorflow.keras.layers import Input from tensorflow.keras.models import Model # 1. 原有输入 + 新增y1_true作为输入层 x1 = Input(shape=(...), name='x1') x2 = Input(shape=(...), name='x2') x3 = Input(shape=(...), name='x3') y1_true = Input(shape=(...), name='y1_true') # 新增的ground truth输入层 # 2. 你的模型原有逻辑,包括生成dec_x1、Y1、y1/y2/y3的部分 # ... 省略你的模型实现代码,比如encoder、decoder、下游预测层 ... # dec_x1 = 解码x1得到的张量 # Y1 = 依赖x1/x2/x3计算得到的张量 # y1,y2,y3 = 模型原有输出张量 # 3. 定义损失 mse = tf.keras.losses.MeanSquaredError() loss1 = mse(x1, dec_x1) loss2 = mse(Y1, y1_true) # 直接引用y1_true输入层张量即可 # 4. 构建模型:inputs包含原有输入 + y1_true,outputs还是原有三个输出 model = Model(inputs=[x1, x2, x3, y1_true], outputs=[y1, y2, y3]) model.add_loss(loss1) model.add_loss(loss2) # 5. 编译和训练 model.compile(optimizer='adam') # 损失已经通过add_loss添加,不需要额外传loss参数 # 训练时输入列表对应四个输入:x1、x2、x3、y1_true的实际值,标签还是传原来的y1/y2/y3即可 model.fit( [train_x1, train_x2, train_x3, train_y1_true], [train_y1, train_y2, train_y3], epochs=10, batch_size=32 )
预测阶段处理
预测时如果不需要计算损失,给y1_true传对应shape的占位值(比如全0数组)即可,不会影响前向推理得到y1/y2/y3的结果。如果不想传无用的占位值,可以单独拆分出推理用的子模型,只取输入x1/x2/x3到输出y1/y2/y3的子图即可。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

