【问题标题】:How to model.predict inside loss function? (Tensorflow, Keras)如何在损失函数中建模。预测? (张量流,Keras)
【发布时间】:2020-12-02 10:45:32
【问题描述】:

我正在尝试为具有以下结构的回归问题构建自定义损失,遵循此答案: Keras Custom loss function to pass arguments other than y_true and y_pred

现在,我的功能如下:

def CustomLoss(model,X_valid,y_valid,batch_size):
    def Loss(y_true,y_pred):
        n_samples=5
        mc_predictions = np.zeros((n_samples,256,256))
        for i in range(n_samples):
           y_p = model.predict(X_valid, verbose=1,batch_size=batch_size)
    (Other operations...) 
        return LossValue
    return Loss

尝试执行此行时 y_p = model.predict(X_valid, verbose=1,batch_size=batch_size)我收到以下错误:

方法需要在跨副本上下文中,使用get_replica_context().merge_call()

根据我收集到的信息,我无法在损失函数中使用 model.predict。是否有解决方法或解决方案? 如果我的问题很清楚,或者您需要任何其他信息,请告诉我。谢谢!

【问题讨论】:

  • 我认为如果你真的想破解它,你可能会破解它。本质上,主要问题是 predict 旨在调用静态图,因此不能成为静态图的组件。我认为您不想/不需要使用预测,因为您可能已经在 X/Y 中拥有所有数据信息,您能否说明为什么不使用或提供更多上下文?
  • 我想预测损失函数中的 n_samples 以生成贝叶斯近似值。因此,我可以比较y_truey_bayesian,而不是比较y_truey_pred。我希望这会有所帮助
  • y_bayesian 是在没有梯度的情况下计算的?你不能只将 y_bayesian 传递给自定义损失吗?
  • y_bayesian 在每个时期发生变化。这就是为什么我的第一个想法是在损失函数中预测以更新 y_bayesian。有没有其他方法可以分步训练?谢谢
  • 是的,您有几个选择,您可以使用 GradientTape 进行自定义训练循环,或者您可以进行自定义拟合,或者您甚至可以对将更新的批号设置一个条件y_bayesian 在你的纪元结束时。

标签: python tensorflow loss-function


【解决方案1】:

听起来您可以为此使用 model.add_loss。您可以使用它来指定模型内部的损失函数。它还消除了损失函数只接受 y 和 y_pred 的需要。 https://www.tensorflow.org/api_docs/python/tf/keras/layers/Layer#add_loss \ 一些伪代码:

class YourModel(tf.keras.Model): 
    ...
    def call(self, inputs): 
        unpack, any, extra, stuff = inputs
        (your network code goes here)
        loss = (other operations)
        self.add_loss(loss)
        return output

(如果您不知道,model.predict 基本上只是 model.call,但附加了一些额外的花里胡哨。)

【讨论】:

  • 感谢您的建议。我一定会尝试的。对模型使用类有什么好处?
  • 与使用顺序模型相比,它的可定制性和灵活性要高得多。也可以很好地使用 OOP 方法。对于更简单的事情,它最终可能会有点冗长。
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 2017-08-20
  • 2021-11-20
  • 2017-10-16
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多