角度的损失函数(和编码?)

机器算法验证 损失函数 张量流 喀拉斯 循环统计
2022-04-10 07:51:44

我正在训练一个网络来预测信号的到达角度。标签是 [-180, 180) 区间中的单个值。

我看到 ±180 度左右的预测不连续,这是有道理的,因为该间隙周围的损失是由均方根误差错误地计算的。

我正在寻找一种以模块化方式工作的损失函数。如果存在这种情况,则 175 度和 -175 度之间的差值应计算为 10(而不是 350)。

我的理解是这样的函数会引入不连续性,因此可能不是一种有效的方法。我正在寻找一些关于如何处理这些循环变量的指导,比如角度、一天中的小时、一周中的一天......

这已在“ Encoding Angle Data for Neural Network ”问题中得到解决,我觉得保持角度变量的线性很重要(我的输入也是几个角度),我使用 sin/cos 编码方法没有得到好的结果在那个问题中提出。这里也讨论了这个问题:从图像预测角度的模型的正确损失是什么?.

这是我目前正在做的事情,它适用于角度(-180、180)。

def metric_stddev_diff(y_true, y_pred):
    return tf.keras.backend.std(y_true - y_pred)

def model_create():

    model = tf.keras.Sequential([
        tf.keras.layers.Dense(128, activation='sigmoid', dtype='float64'),
        tf.keras.layers.Dense(64, activation='linear', dtype='float64'),
        tf.keras.layers.Dense(1, activation='linear', dtype='float64'),
    ])

    model.compile(optimizer='adam',  # 'rmsprop'  'adam',
                  loss='mean_absolute_error',  # 'mean_absolute_error'  'mean_squared_error'  'sparse_categorical_crossentropy'
                  metrics=['mean_absolute_error', metric_stddev_diff])

    return model
1个回答

处对称且可微的损失函数都是局部二次的。因此,当您需要对称性和可微性时,您不必在寻找良好的损失函数时过于挑剔。0

请注意,对于附近的角度余弦的泰勒级数展开给出ϕθ,

L(ϕ,θ)=2(1cos(ϕθ))=(ϕθ)2+O((ϕθ)4)

(以及的所有整数倍)到三阶是局部二次的。此外,的这个函数表现得还不错:它是为所有角度定义的,在任何地方都是可微的,并且——最重要的是——尊重角度比较的模块化性质。因此是二次损失的自然且简单的角度版本。这将是开始分析的好地方。ϕθ=02πϕθL

如果您需要更大的灵活性,请考虑将损失定义为显然这是绝对差的循环模拟。2(1cos(ϕθ)):