Функция потери RMSE/RMSLE в Keras

Я пытаюсь участвовать в своем первом соревновании в Каггле, где 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_true и y_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)) 

Я получаю следующую ошибку с этой функцией:

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

Спасибо за ваши идеи, я ценю каждую помощь!

Ответ 1

Когда вы используете пользовательские потери, вам нужно поставить их без кавычек, когда вы передаете объект функции, а не строку:

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"])

Ответ 2

Принятый ответ содержит ошибку, которая приводит к тому, что 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)))

Ответ 3

Если вы используете последний тензор потока ночью, хотя в документации нет tf.keras.metrics.RootMeanSquaredError() в исходном коде есть 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')])