我在使用Tensorflow
和keras
时遇到问题。这个问题我们可以这样解释:
我们有一个模型(卷积神经网络),其输出形式为[None, 7, 7, 6]
。我们有一个函数“ custom_loss”。该函数具有y_true和y_pred参数。它们的格式为[7,7,6]
。编译时,出现错误消息:TypeError: must be real number, not Tensor
。我想在调用y_pred[k][l][m]
和y_true[k][l][m]
时会出错,但是我不知道如何解决这个问题,以将None
包含在[None, 7, 7, 6]
中。请帮忙。
更新:这是代码
def custom_loss(y_true, y_pred):
loss = 0
for i in range(S*S):
k, l = i%S, i//S
first_part = 5* sum([(y_pred[k][l][m] - y_true[k][l][m])**2 for m in range(1,3)])
second_part = 5 * sum([(math.sqrt(y_pred[k][l][m]) - math.sqrt(y_true[k][l][m])) ** 2 for m in range(3, 5)])
third_part = 5* sum([(y_pred[k][l][m] - y_true[k][l][m])**2 for m in [0, 5]])
if y_true[k][l][0] > 0.5:
loss += first_part + second_part + third_part
else:
loss += 0.5 * (y_pred[k][l][0] - y_true[k][l][0])**2
return loss
答案 0 :(得分:0)
在keras中使用损失函数(带有tensorflow后端)时,它是用于构建执行图的,而不是直接执行的。
您必须使用tensorflow或keras后端函数来定义损失函数。如果编译模型keras(并以tensorflow作为后端),则尝试构建执行图,并因此通过损失函数发送张量。 math
软件包不支持张量。另外,在您的损失函数中也无法使用if
,因为它是不可导出的。相反,您可以使用非常接近阶跃函数的S型函数。
答案 1 :(得分:0)
在keras
(和TensorFlow
中,不急于执行)中,您无法访问张量的内容。因此,行为
loss += 0.5 * (y_pred[k][l][0] - y_true[k][l][0])**2
将失败。您可以尝试将TensorFlow
与keras
一起使用急切的执行模式,如here所述。
通常,您应该始终尝试仅使用keras
后端的内置功能或TensorFlow
操作来表达这些内容。只需尝试使用矩阵/矢量表示法来表达您的损失函数,然后在keras
中表达它就容易了(也许我们也可以为您提供帮助)。