具有条件 return 值的自定义损失

Custom loss with conditional return value

我想要一个带有这种正则化的损失函数:对于每个预测,如果预测点的范数低于 0.9 或大于 1,我想应用正则化。

所以我写了这个:

def custom_loss(y_true, y_pred):

ret = keras.losses.mean_squared_error(y_true, y_pred)

n = tf.norm(y_pred, axis = 1)
intern_circle_distance = n - 0.9        
return tf.where(tf.logical_and(tf.greater(intern_circle_distance, 0),
                               tf.less(intern_circle_distance, 0.1))
                        ret,
                        ret*2)

当我在model.compile中使用这个时,返回错误:

形状必须具有相同的等级,但对于 'loss_71/Hyper_loss/Select'(运算符:'Select'),形状必须为 0 和 1,输入形状:[?]、[]、[].

我尝试了 keras 环境之外的损失,它似乎有效。 例如:

a = tf.constant([[-1.0, 1.5]])
n = a - 1
K.eval(tf.where(tf.logical_and(tf.greater(n, 0)),
                               tf.less(n, 2)),
                a, a*2))

returns 我张量 [-2., 1.5]

为什么它在keras损失函数之外起作用而在keras损失函数内部不起作用? 它如何在 keras 损失函数中工作?

keras.losses.mean_squared_error 给你一个标量数,所有平方误差的平均值。如果你想改变每个例子的误差计算,那么做这样的事情:

def custom_loss(y_true, y_pred):
    diff = tf.squared_difference(y_true, y_pred)
    n = tf.norm(y_pred, axis=1)
    intern_circle_distance = n - 0.9
    diff_reg = tf.where((intern_circle_distance > 0) & (intern_circle_distance <0.1))
                        diff, 2 * diff)
    return tf.reduce_mean(diff_reg)