Python 有没有办法在tensorflow中动态加权增加损失函数?

Python 有没有办法在tensorflow中动态加权增加损失函数?,python,tensorflow2.0,tf.keras,Python,Tensorflow2.0,Tf.keras,在我的代码中,我有两个自定义损失函数。一个是负对数似然(NLL),另一个是KL散度(KLD) 每一个都单独计算,并使用Model.add_loss(NLL)和Model.add_loss(KLD)添加到tf.keras.Model中 对于第一个x时代,我只希望合并NLL,但之后我希望KLD逐渐增加其影响(退火)。我希望的结构是: weight_KL {epoch 00 -> 09} == 0.0 weight_KL {epoch 10 -> 19} += 0.1 weight_KL

在我的代码中,我有两个自定义损失函数。一个是负对数似然(NLL),另一个是KL散度(KLD)

每一个都单独计算,并使用
Model.add_loss(NLL)
Model.add_loss(KLD)
添加到
tf.keras.Model

对于第一个
x
时代,我只希望合并NLL,但之后我希望KLD逐渐增加其影响(退火)。我希望的结构是:

weight_KL {epoch 00 -> 09} == 0.0
weight_KL {epoch 10 -> 19} += 0.1
weight_KL {epoch 20 -> ..} == 1.0
我的看法是,有两个损失函数加在一起,权重随时间变化:

total_loss = NLL + weight_KL * KLD

在TensorFlow 2中有没有实现这一点的方法?

您可以在
model.fit()中使用
callbacks
参数。根据需要,在“新纪元”开始时的内置功能
或“新纪元”结束时的
中添加您的损失调整

定义回调函数,如下所示:

# Define the Required Callback Function
class LossCallback(tf.keras.callbacks.Callback):
  def on_epoch_begin(self, epoch, logs=None):
    if (epoch < 3):
      model.add_loss(NLL + KLD)
    else:
      model.add_loss(NLL + KLD +0.1)
回调
中还有几个选项,如批处理上的
开始
、批处理上的
结束
等,您可以找到它们


希望这能回答你的问题

您可以在
model.fit()
中使用
callbacks
参数。根据需要,在“新纪元”开始时的内置功能
或“新纪元”结束时的
中添加您的损失调整

定义回调函数,如下所示:

# Define the Required Callback Function
class LossCallback(tf.keras.callbacks.Callback):
  def on_epoch_begin(self, epoch, logs=None):
    if (epoch < 3):
      model.add_loss(NLL + KLD)
    else:
      model.add_loss(NLL + KLD +0.1)
回调
中还有几个选项,如批处理上的
开始
、批处理上的
结束
等,您可以找到它们


希望这能回答你的问题

是否有可能提供一个简单、可复制的示例?您是否愿意使用
GradientTape
而不是
model.fit()
?是否有可能提供一个简单、可复制的示例?您是否愿意使用
GradientTape
而不是
model.fit()
?@evanr70-如果答案回答了您的问题,请您投票并接受答案。谢谢。@evanr70-如果答案回答了你的问题,你能投票接受吗。非常感谢。