我无法找到有这个问题的人所以我问。
我想在Keras / Tensorflow中实现一个自定义损失函数,它以不同的方式处理y值的不同列。我读到这是不可能开箱即用的,因为Keras损失函数只需要两个参数y_pred
和y_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
这是否意味着这根本不是一种有效的方式(即使模型编译)或是因为某些原因它没有显示损失?如果不是
,我该怎么办?我很感激任何评论。
答案 0 :(得分:1)
损失函数必须返回一个"数字" (或者只是一个只有一个数的张量),而不是一个有很多数的张量。
使用"轴"在" k.mean"中,你将它保持为一个包含许多条目的张量。
尝试"轴=无"或者只是删除轴参数。
问题可能来自模型的早期。可以肯定的是,尝试使用常规" mse"损失函数首先,以防万一。
答案 1 :(得分:0)
你的意思是两个输出吗?
你似乎想要做的事情当然是可能的。你得到一个nan的事实表明你试图实现它的方式有问题。我建议在损失函数的某些点运行print(math.isnan())以查看错误的来源。您能否提供有关您尝试做的更多详情?