Keras损失函数中的“无”

时间:2018-08-27 06:21:37

标签: tensorflow keras loss-function

我在使用Tensorflowkeras时遇到问题。这个问题我们可以这样解释:

我们有一个模型(卷积神经网络),其输出形式为[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

2 个答案:

答案 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

将失败。您可以尝试将TensorFlowkeras一起使用急切的执行模式,如here所述。

通常,您应该始终尝试仅使用keras后端的内置功能或TensorFlow操作来表达这些内容。只需尝试使用矩阵/矢量表示法来表达您的损失函数,然后在keras中表达它就容易了(也许我们也可以为您提供帮助)。