Keras 后端自定义损失函数
Posted
技术标签:
【中文标题】Keras 后端自定义损失函数【英文标题】:Keras backend Custom Loss Function 【发布时间】:2018-12-26 00:13:32 【问题描述】:我正在尝试计算 (tp+tn)/total_samples
作为我的自定义损失函数。我知道如何在列表和列表理解中执行此操作,但我想我无法将 y_true
和 y_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_crossentropy
或categorical_crossentropy
。
选角:
t_zeros = K.cast(t_zeros, K.floatx())
t_ones = K.cast(t_ones, K.floatx())
【讨论】:
以上是关于Keras 后端自定义损失函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TensorFlow 后端屏蔽 Keras 中的损失函数?