Keras自定义丢失功能,带两个输入

时间:2017-06-09 17:47:35

标签: python machine-learning tensorflow neural-network keras

我无法找到有这个问题的人所以我问。 我想在Keras / Tensorflow中实现一个自定义损失函数,它以不同的方式处理y值的不同列。我读到这是不可能开箱即用的,因为Keras损失函数只需要两个参数y_predy_true

然而,我试图将它们分成两个输入来实现我想要的。

def noise_loss_fct9(y_true, y_pred):
  lmbd = 1.0
  border = 9
  y_true_measurement = y_true[:, :border]
  y_true_process = y_true[:, border:]
  y_pred_measurement = y_pred[:, :border]
  y_pred_process = y_pred[:, border:]

  error_measurement = K.mean(K.square(
      y_true_measurement - y_pred_measurement
  ), axis=-1)
  error_process = K.mean(K.square(
      y_true_process - y_pred_process
  ), axis=-1)

  return error_measurement + lmbd * error_process

即使这个损失函数确实在日志中编译,它也会显示nan

Epoch 1/10
95s - loss: nan
Epoch 2/10
87s - loss: nan

这是否意味着这根本不是一种有效的方式(即使模型编译)或是因为某些原因它没有显示损失?如果不是

,我该怎么办?

我很感激任何评论。

2 个答案:

答案 0 :(得分:1)

损失函数必须返回一个"数字" (或者只是一个只有一个数的张量),而不是一个有很多数的张量。

使用"轴"在" k.mean"中,你将它保持为一个包含许多条目的张量。

尝试"轴=无"或者只是删除轴参数。

问题可能来自模型的早期。可以肯定的是,尝试使用常规" mse"损失函数首先,以防万一。

答案 1 :(得分:0)

你的意思是两个输出吗?

你似乎想要做的事情当然是可能的。你得到一个nan的事实表明你试图实现它的方式有问题。我建议在损失函数的某些点运行print(math.isnan())以查看错误的来源。您能否提供有关您尝试做的更多详情?