【问题标题】:TensorFlow: Why does RMSE calculation comes out similar to MAETensorFlow:为什么 RMSE 计算出来的结果类似于 MAE
【发布时间】:2019-02-18 16:27:10
【问题描述】:

我无法理解为什么我的自定义 RMSE 损失函数的值与 MAE 相同。

我有一个模型,我用 loss='mae' 训练一次,用自定义函数训练一次:

def root_mean_squared_error(y_true, y_pred):
        return keras.sqrt(keras.mean(keras.square(y_pred - y_true),axis=-1)) 

(我知道做 sqrt 并没有实际的好处,只是为了掌握我所做的事情)。 我的问题是,当我使用自定义函数时,我得到的输出显示损失值等于 MAE。 例如,这是一个示例输出:

/1 [==============================] - 0s 173ms/步 - 损失:0.0450 - mean_squared_error:0.0091 - mean_absolute_error:0.0450 Epoch 96/100 1/1 [===============================] - 0s 169ms/步 - 损失:0.0449 - mean_squared_error:0.0091 - mean_absolute_error:0.0449 Epoch 97/100 1/1 [===============================] - 0s 172ms/step - loss: 0.0448 - mean_squared_error:0.0091 - mean_absolute_error:0.0448 Epoch 98/100 1/1 [==============================] - 0s 166ms/步 - 损失:0.0447 - mean_squared_error:0.0091 - mean_absolute_error:0.0447 Epoch 99/100 1/1 [==============================] - 0s 170ms/步 - 损失:0.0447 - mean_squared_error: 0.0091 - mean_absolute_error: 0.0447

MAE 不应与 RMSE 相同。 另一个奇怪的事情是,我预计 RMSE 是 sqrt(MSE),但从上面看到的数字来看,它不是。

虽然它没有添加更多信息,但这是我的编译行:

model.compile(optimizer = Adam(lr = 1e-4), loss = root_mean_squared_error, metrics=['mse', 'mae'])

编辑: 我的训练数据和目标数据是1通道的单色图像(所以张量形状是(None, 256, 256, 1)

【问题讨论】:

    标签: tensorflow keras loss-function


    【解决方案1】:

    meanaxis=-1 计算逐行平均值。因此,如果您只有一列,则没有任何变化(单个值的平均值)。把它放到sqrt 然后用square 取消,最后用abs 结束。

    keras 中的损失函数似乎定义了逐行损失,然后由 keras 内部计算平均值。

    Keras 文档说 (https://keras.io/losses/):

    实际优化的目标是所有数据点的输出数组的平均值。

    这意味着没有简单的方法在 keras 上定义 RMSE,因为它不能写成逐行损失的平均值。

    【讨论】:

    • 我编辑了我的答案以澄清我的数据是 3D(1 通道图像)。删除 sqrt 也会给出 MSE。
    【解决方案2】:

    经过一些调试发现我的问题。 Kota Mori 的回答几乎完全正确。谢谢。

    我的张量形状是 (256, 256, 1) 我在轴 -1 上的平均值意味着我只在最后一个维度上取平均值,它只包含一个值,所以没有效果。得到的张量形状是 (256,256)。正如 Kota 所说,sqrt 取消了平方,所有数据点的平均值由 keras 自动计算。

    有一种计算 RMSE 的简单方法。这是更正后的代码:

    def root_mean_squared_error(y_true, y_pred):
            return keras.sqrt(keras.mean(keras.square(y_pred - y_true),axis=[-1,-2,-3])) 
    

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 2016-11-26
      • 2013-09-18
      • 1970-01-01
      • 2020-01-05
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多