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 上问了这个问题,但它被搁置为题外话。
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