我正在训练一个网络来预测信号的到达角度。标签是 [-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