Keras,循环输出的成本函数?
Keras, cost function for cyclic outputs?
现在我正在尝试使用神经网络为图像着色。我想用 HSV 颜色 space 来做。这个问题是色调通道是循环的。色调的标准化值介于 0 和 1 之间。例如,模型预测为 0.99,但实际色调为 0.01。对于正常的均方误差损失,这看起来很遥远。然而,距离实际上更像是 0.02。我怎样才能在keras中获得循环损失函数?
从预测色调 A
到实际色调 B
的真实距离实际上是 3 个项中的最小值:
(A - B)^2
(不环绕的距离)
(A - B + 1)^2
(向左环绕的距离)
(A - B - 1)^2
(向右环绕的距离)
例如,在您的示例中,从 A = 0.99
到 B = 0.01
的最短路径是向右绕行,距离为 (A - B - 1)^2 = (0.99 - 0.01 - 1)^2 = (-0.02)^2 = 0.02^2
.
既然我们已经弄清楚了数学原理,那么我们如何实现它呢? Keras 的 implementation 均方误差为:
from keras import backend as K
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
以下是使其循环的调整:
def cyclic_mean_squared_error(y_true, y_pred):
return K.mean(K.minimum(K.square(y_pred - y_true),
K.minimum(K.square(y_pred - y_true + 1),
K.square(y_pred - y_true - 1)), axis=-1)
要使用此损失函数,请在编译模型时指定loss=cyclic_mean_squared_error
。
现在我正在尝试使用神经网络为图像着色。我想用 HSV 颜色 space 来做。这个问题是色调通道是循环的。色调的标准化值介于 0 和 1 之间。例如,模型预测为 0.99,但实际色调为 0.01。对于正常的均方误差损失,这看起来很遥远。然而,距离实际上更像是 0.02。我怎样才能在keras中获得循环损失函数?
从预测色调 A
到实际色调 B
的真实距离实际上是 3 个项中的最小值:
(A - B)^2
(不环绕的距离)(A - B + 1)^2
(向左环绕的距离)(A - B - 1)^2
(向右环绕的距离)
例如,在您的示例中,从 A = 0.99
到 B = 0.01
的最短路径是向右绕行,距离为 (A - B - 1)^2 = (0.99 - 0.01 - 1)^2 = (-0.02)^2 = 0.02^2
.
既然我们已经弄清楚了数学原理,那么我们如何实现它呢? Keras 的 implementation 均方误差为:
from keras import backend as K
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
以下是使其循环的调整:
def cyclic_mean_squared_error(y_true, y_pred):
return K.mean(K.minimum(K.square(y_pred - y_true),
K.minimum(K.square(y_pred - y_true + 1),
K.square(y_pred - y_true - 1)), axis=-1)
要使用此损失函数,请在编译模型时指定loss=cyclic_mean_squared_error
。