Keras中的RMSE/RMSLE损失函数

den*_*nis 23 python keras custom-function loss-function

我尝试参加我的第一次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)
Run Code Online (Sandbox Code Playgroud)

我尝试了一个root_mean_squared_error我在GitHub上找到的自定义函数,但据我所知,语法不是必需的.我想y_truey_pred必须被定义传递到返回之前,但我不知道究竟怎么了,我刚开始用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)) 
Run Code Online (Sandbox Code Playgroud)

我使用此函数收到以下错误:

ValueError: ('Unknown loss function', ':root_mean_squared_error')
Run Code Online (Sandbox Code Playgroud)

感谢您的想法,我感谢您的一切帮助!

Mat*_*gro 37

当您使用自定义丢失时,您需要在没有引号的情况下放置它,因为您传递的是函数对象,而不是字符串:

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"])
Run Code Online (Sandbox Code Playgroud)

  • 工作得很好,非常感谢您指出该错误。我真的没有这么想过,因为我对编程有点陌生。您根本不知道如何编辑此自定义函数以计算均方根对数误差,对吗? (2认同)
  • 您应该始终添加导入 `import tensorflow.keras.backend as K` (我将其添加到答案中) (2认同)

小智 22

接受的答案包含错误,导致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)))
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您使用的是最新的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')])
Run Code Online (Sandbox Code Playgroud)


Geo*_*e C 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"])
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一件事是,该损失函数的流形可能会达到无穷大(因为平方根),并且训练可能会失败。 (2认同)