Keras 中的 RMSE/RMSLE 损失函数
RMSE/ RMSLE loss function in Keras
我尝试参加我的第一个 Kaggle 竞赛,其中 RMSLE
作为所需的损失函数给出。因为我没有找到如何实现这个 loss function
,所以我尝试满足于 RMSE
。我知道这是过去 Keras
的一部分,有没有办法在最新版本中使用它,也许通过 backend
自定义功能?
这是我设计的神经网络:
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)
我尝试了在 GitHub 上找到的自定义 root_mean_squared_error
函数,但据我所知,语法并不是必需的。我认为 y_true
和 y_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')
感谢您的想法,感谢您的帮助!
当你使用自定义损失时,你需要把它不带引号,因为你传递的是函数对象,而不是字符串:
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"])
接受的答案包含一个错误,导致 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)))
如果您每晚使用最新的tensorflow,虽然文档中没有RMSE,但source code中有一个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')])
我更喜欢重用 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"])
你可以像其他答案中显示的 RMSE 一样做 RMSLE,你只需要合并日志功能:
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))))
就像以前一样,但使用 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))
我尝试参加我的第一个 Kaggle 竞赛,其中 RMSLE
作为所需的损失函数给出。因为我没有找到如何实现这个 loss function
,所以我尝试满足于 RMSE
。我知道这是过去 Keras
的一部分,有没有办法在最新版本中使用它,也许通过 backend
自定义功能?
这是我设计的神经网络:
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)
我尝试了在 GitHub 上找到的自定义 root_mean_squared_error
函数,但据我所知,语法并不是必需的。我认为 y_true
和 y_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')
感谢您的想法,感谢您的帮助!
当你使用自定义损失时,你需要把它不带引号,因为你传递的是函数对象,而不是字符串:
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"])
接受的答案包含一个错误,导致 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)))
如果您每晚使用最新的tensorflow,虽然文档中没有RMSE,但source code中有一个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')])
我更喜欢重用 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"])
你可以像其他答案中显示的 RMSE 一样做 RMSLE,你只需要合并日志功能:
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))))
就像以前一样,但使用 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))