Keras 损失函数中的`None`
`None` in Keras loss function
我在使用 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
当你在 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
.
来表达它
我在使用 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
当你在 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
.