keras自定义丢失功能

时间:2017-09-23 21:25:58

标签: python-2.7 machine-learning tensorflow keras

我是Keras框架的新手,我想实现以下的丢失功能 Root Mean Squared Logarithmic Error

以下是我使用张量流后端的Keras代码

def loss_function(y_true, y_pred):
    ones = K.ones(shape=K.shape(y_pred).shape)
    y_pred = tf.add(y_pred,ones)
    y_true = tf.add(y_true,ones)
    val = K.sqrt(K.mean(K.sum(K.log(y_pred)-K.log(y_true))))
    return val

但我最终得到以下错误:

ValueError: Error when checking input: expected dense_1_input to have shape (None, 16) but got array with shape (1312779, 11)

将val返回为0。

1 个答案:

答案 0 :(得分:1)

您的操作顺序颠倒过来。

由于“log(true) - log(pred)”可以是负数或正数(结果可能比预期的稍高或稍低),因此正方形是必须发生的第一件事。 (广场负责消除负面信号)。

平均值是最后一个(最外部的),因为您希望首先计算每个元素的错误,然后才能得到错误的平均值。 (平均函数已经携带了sum函数)。

所以:

def loss_function(y_true, y_pred):

    y_pred = y_pred + 1
    y_true = y_true + 1
    return K.mean(K.square(K.log(y_pred)-K.log(y_true)))

请注意,这不包含“根”部分。如果你想添加它,我会说根应该在均值之前(与图中的公式不同)

我会改用它:

return K.mean(K.sqrt(K.square(K.log(y_pred)-K.log(y_true))))

确保您的模型以激活结束,输出的数字大于或等于零:

  • Relu没问题
  • Sigmoid没问题
  • Softmax没问题

其他激活可能会有负值,并会带来日志错误:

  • 线性不好
  • tanh不行