【问题标题】:keras custom loss functionkeras 自定义损失函数
【发布时间】:2017-09-24 06:44:01
【问题描述】:

我是 Keras 框架的新手,我想实现以下损失函数 Root Mean Squared Logarithmic Error

这是我的带有 tensorflow 后端的 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。

【问题讨论】:

  • 什么是网络代码(特别是输入层)?你的数据是什么形状的?他们匹配吗?您的每个数据点是否有 11 个属性宽且 input_shape=(16,) 而不是 (11) ?
  • 这个错误与你的损失函数无关。它与您的输入数据(训练数据)有关。您的输入数据的形状 (1312779,11) 无法进入您的模型,该模型需要像 (anything, 16) 这样的形状。
  • 谢谢@DanielMöller 我进行了更改以匹配模型输入中数据的维度。但是我在每个时期都会损失 0.0000e+00。我对损失函数的实现是否正确?如果不是,我该如何实施?

标签: python-2.7 machine-learning tensorflow keras


【解决方案1】:

您的操作顺序颠倒了。

由于“log(true) - log(pred)”可以是负数或正数(结果可能比预期的高一点或低一点),所以首先必须发生平方。 (正方形负责消除负号)。

平均值是最后一个(最外部的),因为您首先要计算每个元素的误差,然后才能得到误差的平均值。 (mean 函数中已经带有 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 不行

【讨论】:

  • Ok :) -- 请考虑将其标记为正确答案。
猜你喜欢
  • 2020-12-19
  • 2017-12-18
  • 2020-03-27
  • 2018-10-28
  • 2017-12-29
  • 1970-01-01
  • 2020-02-27
  • 2018-12-26
  • 2018-07-07
相关资源
最近更新 更多