41

我尝试参加我的第一次 Kaggle 比赛,其中RMSLE给出了所需的损失函数。因为我没有找到如何实现这个loss function我试图解决的问题RMSE。我知道这是Keras过去的一部分,有没有办法在最新版本中使用它,也许通过自定义功能backend

这是我设计的NN:

from keras.models import Sequential
from keras.layers.core import Dense , Dropout
from keras import regularizers

model = Sequential()
model.add(Dense(units = 128, kernel_initializer = "uniform", activation = "relu", input_dim = 28,activity_regularizer = regularizers.l2(0.01)))
model.add(Dropout(rate = 0.2))
model.add(Dense(units = 128, kernel_initializer = "uniform", activation = "relu"))
model.add(Dropout(rate = 0.2))
model.add(Dense(units = 1, kernel_initializer = "uniform", activation = "relu"))
model.compile(optimizer = "rmsprop", loss = "root_mean_squared_error")#, metrics =["accuracy"])

model.fit(train_set, label_log, batch_size = 32, epochs = 50, validation_split = 0.15)

我尝试了root_mean_squared_error在 GitHub 上找到的自定义函数,但据我所知,语法不是必需的。我认为y_trueand they_pred必须在传递给 return 之前定义,但我不知道到底是怎么回事,我刚开始用 python 编程,我的数学真的不是那么好......

from keras import backend as K

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

我收到此功能的以下错误:

ValueError: ('Unknown loss function', ':root_mean_squared_error')

感谢您的想法,感谢您的每一个帮助!

4

6 回答 6

64

当您使用自定义损失时,您需要将其不带引号,因为您传递函数对象,而不是字符串:

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

model.compile(optimizer = "rmsprop", loss = root_mean_squared_error, 
              metrics =["accuracy"])
于 2017-05-09T07:34:29.437 回答
31

根据以下问题,接受的答案包含一个错误,导致 RMSE 实际上是 MAE:

https://github.com/keras-team/keras/issues/10706

正确的定义应该是

def root_mean_squared_error(y_true, y_pred):
        return K.sqrt(K.mean(K.square(y_pred - y_true)))
于 2018-10-24T08:12:47.303 回答
13

如果你每晚使用最新的 tensorflow,虽然文档中没有 RMSE,但tf.keras.metrics.RootMeanSquaredError()源代码中有一个。

示例用法:

model.compile(tf.compat.v1.train.GradientDescentOptimizer(learning_rate),
              loss=tf.keras.metrics.mean_squared_error,
              metrics=[tf.keras.metrics.RootMeanSquaredError(name='rmse')])
于 2019-05-12T22:34:07.660 回答
5

我更喜欢重用 Keras 的部分工作

from keras.losses import mean_squared_error

def root_mean_squared_error(y_true, y_pred):
    return K.sqrt(mean_squared_error(y_true, y_pred))

model.compile(optimizer = "rmsprop", loss = root_mean_squared_error, 
          metrics =["accuracy"])
于 2020-02-13T13:13:35.920 回答
3

您可以按照其他答案中显示 RMSE 的方式执行 RMSLE,您还需要合并 log 函数:

from tensorflow.keras import backend as K

def root_mean_squared_log_error(y_true, y_pred):
    return K.sqrt(K.mean(K.square(K.log(1+y_pred) - K.log(1+y_true))))
于 2020-07-30T22:01:19.493 回答
2

就像以前一样,但使用 Keras 后端的 RMSLE 更简化(直接)版本:

import tensorflow as tf
import tensorflow.keras.backend as K

def root_mean_squared_log_error(y_true, y_pred):
    msle = tf.keras.losses.MeanSquaredLogarithmicError()
    return K.sqrt(msle(y_true, y_pred)) 
于 2020-12-17T05:14:02.960 回答