自定义Keras损失(不具有形式f(y_true,y_pred))

时间:2018-07-22 21:32:52

标签: python keras deep-learning

def charbonnier(I_x, I_y, I_t, U, V, e):
    loss = K.sqrt(K.pow((U*I_x + V*I_y + I_t), 2) + e)
    return K.sum(loss)

我想使用这个成本函数并对U和V进行优化。由于Keras损失函数只能具有f(y_true,y_pred)的形式,因此我目前正在努力使其与Keras一起使用。

loss

我的模型是完全不受监督的,我没有事实依据。 I_x,I_y和I_t是常量,模型的目标是学习使E(F)最小的U和V。所以我的问题是: 在Keras中实现这种损失函数(不具有形式f(y_true,y_pred))的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

我认为您可能需要修改代码以调整喀拉拉邦的标准。如果网络不受监督,则可以让y_pred == y_ture像自动编码器一样。

答案 1 :(得分:0)

如下定义损失函数:

def charbonnier(I_x, I_y, I_t, U, V, e)
    def loss_fun(y_true, y_pred):
        loss = K.sqrt(K.pow((U*I_x + V*I_y + I_t), 2) + e)
        return K.sum(loss)
    return loss_fun

答案 2 :(得分:0)

如您所见,tf.keras.models.Model.compile 方法中使用的 Keras 损失是面向监督学习的。对于无监督学习(不包括自监督学习,例如 VAE 和 SimCLR),一个好的解决方案是将损失作为张量直接添加到模型中。例如,

inp = tf.keras.layers.Input(...)
u = ...(inp)
v = ...(inp)
model = tf.keras.models.Model(inp, [u,v])

charbonnier_loss_tensor = tf.reduce_sum(tf.sqrt(tf.pow((U*I_x + V*I_y + I_t), 2) + e))
model.add_loss(charbonnier_loss_tensor)