我是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。
答案 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))))
确保您的模型以激活结束,输出的数字大于或等于零:
其他激活可能会有负值,并会带来日志错误: