复杂的自定义损失函数的问题

Posted

技术标签:

【中文标题】复杂的自定义损失函数的问题【英文标题】:Question for complicated custom loss function 【发布时间】:2021-07-20 13:12:17 【问题描述】:

我发现了一些关于使用条件结构的自定义函数的有趣文章。例如,

loss = tf.reduce_sum(tf.where(tf.greater(y_T,y_P),(y_T-y_P)/a,(y_T-y_P)*b)) 

这让我印象深刻。深度学习的基本学习过程依赖于 BP。 tensorflow 能否完成如此复杂的 BP 流程?我很难想象如何BP这个功能并确保效率。谢谢!

【问题讨论】:

【参考方案1】:

是的,你可以,但它必须是一个函数,而不是变量 你可以有一个这样的客户损失函数:

def cust_func(a, b):
    def cust_loss_inner(y_T, y_P):
        y_T, y_P = tf.dtypes.cast(y_T, tf.float32), tf.dtypes.cast(y_P, tf.float32)
        return tf.reduce_sum(tf.where(tf.greater(y_T, y_P), (y_T - y_P) / a, (y_T - y_P) * b))
    return cust_loss_inner

您也可以选择将 y_T、y_P 转换为 float64 或其他,但它们必须具有相同的类型。

要使用上面的loss,你可以用下面的代码编译,3和4对应你想要的a和b值。

model.compile(optimizer=OPTIMIZER,
                  loss=cust_func(3, 4),
                  metrics=METRICS)

【讨论】:

@Hemisphere 如果您认为我的回答有帮助,您介意接受我的回答吗?如果您不确定何时以及如何处理答案,可以查看以下两个链接:what to do with answershow to accept answer

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

Keras 上的自定义损失函数

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

用于三元组损失训练的自定义精度函数

我的自定义损失函数是不是正确? (火炬)

Tensorflow:不提供梯度的自定义损失函数

ValueError:未知损失函数:使用我的自定义损失函数加载模型时的focal_loss_fixed