【问题标题】:`None` in Keras loss functionKeras 损失函数中的“无”
【发布时间】:2018-08-27 06:21:36
【问题描述】:

我在使用 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, 7, 7, 6] 中包含这个None。请帮忙。

更新:这是代码

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

【问题讨论】:

  • 请添加您的代码以重现此错误。

标签: tensorflow keras loss-function


【解决方案1】:

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

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

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

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

【讨论】:

  • 我认为访问张量的内容可以正常工作(至少切片可以)。结合 for 循环和 if 子句它不能工作。但我认为问题在于缺乏对 tensorflow 的 python 代码是关于构建执行图的理解。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 2018-04-03
    • 2019-01-20
    • 2018-10-10
    • 2018-10-21
    • 2020-08-18
    • 2017-10-06
    • 2017-12-21
    • 2019-04-11
    相关资源
    最近更新 更多