【发布时间】: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_true和y_bayesian,而不是比较y_true和y_pred。我希望这会有所帮助 -
y_bayesian 是在没有梯度的情况下计算的?你不能只将 y_bayesian 传递给自定义损失吗?
-
y_bayesian 在每个时期发生变化。这就是为什么我的第一个想法是在损失函数中预测以更新 y_bayesian。有没有其他方法可以分步训练?谢谢
-
是的,您有几个选择,您可以使用 GradientTape 进行自定义训练循环,或者您可以进行自定义拟合,或者您甚至可以对将更新的批号设置一个条件y_bayesian 在你的纪元结束时。
标签: python tensorflow loss-function