我正在尝试将深度学习应用于目标类(500k,31K)之间的高级不平衡的二进制分类问题.我想写一个自定义的损失函数,应该是这样的:最小化(100 - ((predict_smallerclass)/(total_smallerclass))*100)
欣赏有关如何构建此逻辑的任何指示.
我正在尝试使用以下两个损失函数优化模型
def loss_1(pred, weights, logits):
weighted_sparse_ce = kls.SparseCategoricalCrossentropy(from_logits=True)
policy_loss = weighted_sparse_ce(pred, logits, sample_weight=advantages)
Run Code Online (Sandbox Code Playgroud)
和
def loss_2(y_pred, y):
return kls.mean_squared_error(y_pred, y)
Run Code Online (Sandbox Code Playgroud)
然而,因为 TensorFlow 2 期望损失函数的形式为
def fn(y_pred, y_true):
...
Run Code Online (Sandbox Code Playgroud)
我正在使用一种变通方法来解决loss_1我打包pred并weights放入单个张量的地方,然后再将其传递到loss_1调用中model.fit,然后将它们解压到loss_1. 这是不雅和讨厌的,因为pred和weights具有不同的数据类型,因此每次调用model.fit.
此外,我知道 的sample_weight论点fit,这有点像这个问题的解决方案。如果不是因为我使用了两个损失函数并且我只想将其sample_weight应用于其中一个,这可能是一个可行的解决方案。此外,即使这是一个解决方案,它也不能推广到其他类型的自定义损失函数。
话虽如此,我的问题简明地说是:
在 TensorFlow 2 中创建具有任意数量参数的损失函数的最佳方法是什么?
我尝试过的另一件事是传递 atf.tuple但这似乎也违反了 TensorFlow 对损失函数输入的期望。