【发布时间】:2020-01-21 04:17:24
【问题描述】:
我正在尝试使用以下两个损失函数优化模型
def loss_1(pred, weights, logits):
weighted_sparse_ce = kls.SparseCategoricalCrossentropy(from_logits=True)
policy_loss = weighted_sparse_ce(pred, logits, sample_weight=advantages)
和
def loss_2(y_pred, y):
return kls.mean_squared_error(y_pred, y)
但是,因为 TensorFlow 2 期望损失函数的形式为
def fn(y_pred, y_true):
...
我正在使用loss_1 的解决方法,我将pred 和weights 打包到一个张量中,然后在对model.fit 的调用中传递给loss_1,然后在loss_1 中解压缩它们。这是不优雅和讨厌的,因为pred 和weights 是不同的数据类型,所以每次我调用model.fit 时都需要额外的强制转换、打包、解包和取消转换。
此外,我知道fit 的sample_weight 参数,这有点像this question 的解决方案。如果不是因为我使用了两个损失函数并且我只想将sample_weight 应用于其中一个,这可能是一个可行的解决方案。此外,即使这是一个解决方案,它是否也不能推广到其他类型的自定义损失函数。
说了这么多,我的问题,简洁地说,是:
创建具有任意数量的损失函数的最佳方法是什么? TensorFlow 2 中的参数?
我尝试过的另一件事是传递 tf.tuple,但这似乎也违反了 TensorFlow 对损失函数输入的要求。
【问题讨论】:
-
使用闭包怎么样?基本上,你可以定义一个标准的损失函数,我们命名为
inside_loss,它只在你的loss_1中使用(y_true和y_pred)。您可以将权重或 logits、任何参数传递给loss_1。最后,您的loss_1将返回inside_loss这个函数。这很像我们自定义 keras 损失函数的方式。 github.com/keras-team/keras/issues/2121 -
@zihaozhihao 这是一个有趣的解决方案,但是当使用急切张量或 NumPy 数组作为输入时,它就不起作用了。
-
嗯,你是说
loss_1的论点吗?如果是这样,我相信这行得通。 -
对于
loss_1是,不,它不会起作用,因为在创建闭包时闭包捕获的数据不可用。 -
TF 2.0 期望损失函数的形式为
def fn(y_true, y_pred),即y_true 是第一个参数。
标签: tensorflow keras tensorflow2.0