web-dev-qa-db-fra.com

Fonction de perte RMSE / RMSLE dans Keras

J'essaie de participer à ma première compétition Kaggle où RMSLE est donné comme fonction de perte requise. Car je n'ai rien trouvé sur la façon de mettre en œuvre ce loss function J'ai essayé de me contenter de RMSE. Je sais que cela faisait partie de Keras dans le passé, est-il possible de l'utiliser dans la dernière version, peut-être avec une fonction personnalisée via backend?

C'est le NN que j'ai conçu:

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)

J'ai essayé une fonction personnalisée root_mean_squared_error Que j'ai trouvée sur GitHub mais je sais que la syntaxe n'est pas ce qui est requis. Je pense que le y_true Et le y_pred Devraient être définis avant d’être transmis à la déclaration, mais je ne sais pas exactement comment, je viens de commencer à programmer python = et je ne suis vraiment pas bon en maths ...

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

Je reçois l'erreur suivante avec cette fonction:

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

Merci pour vos idées, j'apprécie chaque aide!

21
dennis

Lorsque vous utilisez une perte personnalisée, vous devez la mettre sans guillemets lorsque vous transmettez l'objet fonction, pas une chaîne:

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

La réponse acceptée contient une erreur, ce qui conduit à ce que RMSE soit réellement MAE, conformément au problème suivant:

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

La définition correcte devrait être

def root_mean_squared_error(y_true, y_pred):
        return K.sqrt(K.mean(K.square(y_pred - y_true)))
20
Germán Sanchis

Si vous utilisez le dernier tensorflow tous les soirs, bien qu'il n'y ait pas de RMSE dans la documentation, il existe un tf.keras.metrics.RootMeanSquaredError() dans le code source .

utilisation de l'échantillon:

model.compile(tf.compat.v1.train.GradientDescentOptimizer(learning_rate),
              loss=tf.keras.metrics.mean_squared_error,
              metrics=[tf.keras.metrics.RootMeanSquaredError(name='rmse')])
2
Richard Xue