Keras 损失函数中的`None`

`None` in 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

当你在 keras 中编写一个损失函数(带有 tensorflow 后端)时,它是为了构建你的执行图而不是直接执行。

您必须使用tensorflow 或keras 后端函数来定义您的损失函数。如果你编译你的模型 keras(和 tensorflow 作为后端)尝试构建你的执行图并因此通过你的损失函数发送张量。 math 包不支持张量。也不可能在你的损失函数中使用 if 因为它不可推导。相反,您可以使用非常接近阶跃函数的 sigmoid 函数。

keras 中(和 TensorFlow 没有急切执行)你不能访问张量的内容。因此,行为

loss += 0.5 * (y_pred[k][l][0] - y_true[k][l][0])**2

会失败。您可以尝试将 TensorFlow 的急切执行模式与 keras 一起使用,如 here.

所述

一般来说,您应该始终尝试使用 keras 后端的内置函数或 TensorFlow 操作来表达这些内容。只需尝试使用 matrix/vector 符号来表达你的损失函数,然后更容易(也许我们也可以帮助你)用 keras.

来表达它