我正在尝试优化使用以下两个损失函数的模型
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
参数,这有点像解决这个问题的方法。如果不是因为我正在使用两个损失函数并且只想将sample_weight
应用于其中之一,这可能是可行的解决方法。即使这是一个解决办法,它能推广到其他类型的自定义损失函数吗?
所有这些都说了,我的问题简洁地说就是:
在TensorFlow 2中创建具有任意数量参数的损失函数的最佳方法是什么?
我尝试过的另一件事是传递tf.tuple
,但这似乎也违反了TensorFlow对损失函数输入的要求。
inside_loss
,它只在你的loss_1
中使用 (y_true
和y_pred
)。你可以将权重或对数率等任何参数传递给loss_1
。最后,你的loss_1
将返回inside_loss
函数。这很像我们如何自定义 Keras 损失函数。https://github.com/keras-team/keras/issues/2121 - zihaozhihaoloss_1
的参数吗?如果是的话,我相信那应该可以工作。 - zihaozhihaoloss_1
是不行的,因为闭包捕获的数据在创建闭包时不可用。 - Jon Deatondef fn(y_true, y_pred)
,即 y_true 是第一个参数。 - toliveira