Keras自定义损失范围选择-独立处理值



我有一个自定义损失定义如下:

def custom_mse():
def mse(y_true, y_pred):
great = K.tf.greater(y_true,0.5)
loss = K.square(tf.where(great, y_true, tf.zeros(tf.shape(y_true)))-tf.where(great, y_pred, tf.zeros(tf.shape(y_pred))))
loss_low = K.square(y_true-y_pred)

return loss+loss_low

该损失是两个损失的总和,未受影响的预测和真实标签的MSE,以及仅在真实标签中的值超过0.5的位置上的元素的MSE。

这非常有效,但现在我想做一些不同的事情。

我想创建一个将0.01-0.2范围内的值转换为1的损失,这样模型就会得到这些值不正确的反馈(降低这些值的重要性更高(。从这个线程中,我找到了一种选择范围的方法:

lower_tensor = K.tf.greater(y_pred, 0.01)
upper_tensor = K.tf.less(y_pred, 0.2)
in_range = K.tf.logical_and(lower_tensor, upper_tensor)

然而,我找不到将这些指数应用于原始张量的方法,所以在计算中,它将被当作一个来处理。我想做这样的事情(只是一个例子,这行不通(:

tf.where(in_range, y_pred) = 1
loss = K.square(y_true-y_pred)

有办法做到这一点吗?还是我需要再次分摊损失并将其计算在一起?

您可以将tf.wheretf.ones_like和原始张量一起使用。

示例(y_pred设置为[0.0, 0.1, 0.8, 0.15](:

import tensorflow as tf
y_pred = tf.constant([0.0, 0.1, 0.8, 0.15])
lower_tensor = tf.greater(y_pred, 0.01)
upper_tensor = tf.less(y_pred, 0.2)
in_range = tf.logical_and(lower_tensor, upper_tensor)
# tf.where is (cond, tensor if cond is true, tensor if cond is false)
y_pred_w_ones = tf.where(in_range, tf.ones_like(y_pred), y_pred)

我们得到

>>> y_pred_w_ones
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([0. , 1. , 0.8, 1. ], dtype=float32)>

最新更新