Keras 后端自定义损失函数

Posted

技术标签:

【中文标题】Keras 后端自定义损失函数【英文标题】:Keras backend Custom Loss Function 【发布时间】:2018-12-26 00:13:32 【问题描述】:

我正在尝试计算 (tp+tn)/total_samples 作为我的自定义损失函数。我知道如何在列表和列表理解中执行此操作,但我想我无法将 y_truey_pred 转换为列表。

目前我写的代码是:

def CustomLossFunction(y_true, y_pred):
   y_true_mask_less_zero = K.less(y_true, 0)
   y_true_mask_greater_zero = K.greater(y_true, 0)

   y_pred_mask_less_zero = K.less(y_pred, 0)
   y_pred_mask_greater_zero = K.greater(y_pred, 0)

   t_zeros = K.equal(y_pred_mask_less_zero, y_true_mask_less_zero)
   t_ones = K.equal(y_pred_mask_greater_zero, y_true_mask_greater_zero)

现在我需要将 t_zeros 和 t_ones 中的 TRUES 总数相加,然后将它们相加并除以总样本

我在这一行遇到错误:

sum_of_true_negatives = K.sum(t_zeros)

传递给参数“输入”的值的 DataType bool 不在允许值列表中:float32、float64、int32、uint8、int16

问题:

“(tp+tn)/total_samples”有没有内置的损失函数 如果不是,那么如何使用 Keras 后端进行计算?

【问题讨论】:

【参考方案1】:

在将它们放入计算之前,您必须 cast 您的布尔张量浮动。

但是一个警告,所以你不要浪费你的时间:

此损失函数将不起作用,因为它不可微分。您不能像这样简单地丢弃y_pred 中存在的“连续性”。 (你会得到像“不支持无值”或“一个操作没有梯度”这样的错误)

使用一些现有的标准函数进行分类,例如binary_crossentropycategorical_crossentropy

选角:

t_zeros = K.cast(t_zeros, K.floatx())
t_ones = K.cast(t_ones, K.floatx())

【讨论】:

以上是关于Keras 后端自定义损失函数的主要内容,如果未能解决你的问题,请参考以下文章

在具有条件的 keras 中实现自定义损失函数

Keras 中带有附加变量输入的自定义损失/目标函数

如何使用 TensorFlow 后端屏蔽 Keras 中的损失函数?

Keras 中的自定义损失函数(IoU 损失函数)和梯度误差?

在 Keras 中构建自定义损失函数

Keras 中基于输入数据的自定义损失函数