自定义 RMSE 与采用内置 Keras MSE 的根进行相同预测不同

mka*_*mka 9 python machine-learning keras

我定义了一个自定义的 RMSE 函数:

def rmse(y_pred, y_true):
    return K.sqrt(K.mean(K.square(y_pred - y_true)))
Run Code Online (Sandbox Code Playgroud)

我正在根据 Keras 提供的均方误差对其进行评估:

keras.losses.mean_squared_error(y_true, y_pred)

对于某些(相同的)预测,我分别为 MSE 和 RMSE 指标获得的值是:

mse: 115.7218 - rmse: 8.0966

现在,当我取 MSE 的根时,我得到10.7574,这显然高于自定义 RMSE 函数输出的 RMSE。我一直无法弄清楚为什么会这样,也没有找到有关此特定主题的任何相关帖子。RMSE 函数中是否存在我根本没有看到的错误?或者它是否与 Kerasaxis=-1在 MSE 函数中定义的方式有关(我还没有完全理解其目的)?

这是我调用 RMSE 和 MSE 的地方:

model.compile(loss="mae", optimizer="adam", metrics=["mse", rmse])

所以我希望 MSE 的根与 RMSE 相同。

我最初在 Cross Validated 上问了这个问题,但它被搁置为题外话。

Man*_*han 6

RMSE 损失函数中是否有我根本没有看到的错误?或者它与 Keras 如何在 MSE 损失函数中定义 axis=-1 有某种关系(我还没有完全理解其目的)?

当 Keras 进行损失计算时,批次维度被保留,这就是axis=-1. 返回值是一个张量。这是因为在取平均值之前可能必须对每个样本的损失进行加权,这取决于某些参数是否在fit()sample_weight.

我用这两种方法得到了相同的结果。

from tensorflow import keras
import numpy as np
from keras import backend as K

def rmse(y_pred, y_true):
    return K.sqrt(K.mean(K.square(y_pred - y_true)))

l1 = keras.layers.Input(shape=(32))
l2 = keras.layers.Dense(10)(l1)
model = keras.Model(inputs=l1, outputs=l2)

train_examples = np.random.randn(5,32)
train_labels=np.random.randn(5,10)
Run Code Online (Sandbox Code Playgroud)

MSE方法

model.compile(loss='mse', optimizer='adam')
model.evaluate(train_examples, train_labels)
Run Code Online (Sandbox Code Playgroud)

均方根误差方法

model.compile(loss=rmse, optimizer='adam')
model.evaluate(train_examples, train_labels)
Run Code Online (Sandbox Code Playgroud)

输出

5/5 [==============================] - 0s 8ms/sample - loss: 1.9011
5/5 [==============================] - 0s 2ms/sample - loss: 1.3788
Run Code Online (Sandbox Code Playgroud)

平方(1.9011)= 1.3788