2017-09-23 76 views
0

我是新来Keras框架和我想要实现的 Root Mean Squared Logarithmic Errorkeras自定义的损失函数

这里的下列损失函数与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。

+0

什么是网络代码(特别是输入层)?你的数据的形状是什么?他们匹配吗?每个数据点的属性都很宽,而input_shape =(16,)而不是(11)? – maz

+0

这个错误与你的损失函数无关。这是关于你的输入数据(训练数据)。你的输入数据'(1312779,11)'的形状不能进入你想要形状像'(任何东西,16)'的模型。 –

+0

谢谢@DanielMöller我进行了修改以匹配模型输入中的数据维度。但是,在每个时代,我的损失为0.0000e + 00。我的损失功能是否正确执行?如果不是我如何去执行? – prodo56

回答

0

您的操作顺序相反。由于“log(true)-log(pred)”可以是负数也可以是正数(结果可能比预期的要高一点或低一点),所以平方是必须要做的第一件事情。 (广场负责消除负面信号)。

而意思是最后一个(最外部的),因为你首先要计算每个元素的错误,并且只有在这之后你才能得到错误的均值。 (平均功能已在其中携带和功能)。

所以:

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是确定
  • 乙状结肠是确定
  • SOFTMAX是确定

其他的激活可能为负值,将带来错误与日志:

  • 线是不正常
  • 正切是不正常
+0

谢谢@DanielMöller。它很棒! – prodo56

+0

好的:) - 请考虑将此标记为正确答案。 –