繁体   English   中英

Keras、Python 中的自定义损失函数?

[英]Custom loss function in Keras, Python?

假设我们有预测的输出向量:

y_pred = [1, 0, 0, 1]

和实际输出值:

y_true = [0, 1, 0, 0]

我想构建以下差异向量 y_pred-y_true:

y_diff = [1, -1, 0, 1]

计算其中 1 的数量并将其乘以一个常数。 这应该是我自定义损失函数的结果。 目标是更加重视某种错误(在这种情况下,如果预测值为 0 而真实值为 1,我想要更大的损失)。

这是我的实现尝试:

def custom_loss_function(y_true, y_pred):
    # if it was 1 and you wrote 0, error is very very big
    y_diff = tf.math.subtract(y_true, y_pred)

    def fn(elem):
        if elem == 1:
            return 10
        elif elem == -1:
            return 1
        else:
            return 0

    return tf.reduce_sum(tf.map_fn(fn, y_diff))

问题是这样我的损失函数就不会是“可微的”。 我认为这就是我收到错误的原因:

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

关于如何根据某些条件(例如在当前任务中)实现更大(或更少)损失的自定义损失函数的任何想法?

你的问题是矛盾的。 你说你想要y_pred - y_true但你在代码中计算y_true - y_pred 不过,您可以使用以下内容。

def custom_loss_function(y_true, y_pred):
    # if it was 1 and you wrote 0, error is very very big
    y_diff = y_true - y_pred

    mul_mask = tf.cast(tf.math.equal(y_diff, 1.0), tf.float32)*9.0 + 1
    y_diff = tf.math.sqrt((y_diff * mul_mask)**2)

    return tf.reduce_sum(y_diff)

PS :我希望你有一个很好的理由使用这个自定义损失函数。 因为您可以在执行model.fit()时简单地使用class_weights参数进行model.fit() ,因此,如果您只想对每个类进行权重,则无需自己实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM