现在我正在尝试使用神经网络对图像进行着色。我想在HSV色彩空间中做到这一点。这个问题是色调通道是循环的。色调的标准化值介于0和1之间。例如,模型预测为0.99,但实际色调为0.01。通过正常的均方误差丢失,这看起来很遥远。然而距离实际上更像是0.02。如何在keras中获得循环丢失函数?
答案 0 :(得分:2)
从预测的色调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
。