2017-10-11 5 views
0

Je travaille sur un problème de régression. Mon jeu de données a des étiquettes allant de [0,1]. En raison de l'objectif de conception, l'étiquette dont la valeur est supérieure à 0.3 est convertie en négatif, c'est-à-dire que 0.35 est convertie en -0.35.Combiner l'entropie croisée et mse dans la fonction de perte

Dans keras, j'ai d'abord essayé mse comme fonction de perte, mais les performances ne sont pas bonnes. Après avoir réalisé le signe des étiquettes, j'ai aussi essayé l'entropie binaire. Mais la performance n'est toujours pas bonne.

Comme je l'ai expliqué ci-dessus, il semble que nous pouvons utiliser deux fonctions de perte et les résumer. Mais je ne sais pas comment écrire le code. En outre, si vous avez d'autres suggestions pour ce jeu de données spécifique, veuillez me le faire savoir.

+0

Avez-vous essayé l'erreur absolue (mae)? En outre, l'entropie croisée binaire concerne les problèmes de classification, et non les problèmes de régression. – semicolon

+0

@semicolon dans les deux derniers jours j'ai essayé DNN. Les indicateurs de performance que je me concentre sur la précision des signes. Bien sûr, les valeurs prédites sont également importantes. Avec la structure 'mse' et DNN, la précision du signe actuel est de 81,5%. J'ai essayé votre suggestion avec 'mae' comme fonction de perte et la même structure DNN. La précision du signe est de 81,7%. La réponse donnée par Julio ci-dessous est presque ce que je veux, même si une erreur est soulevée. En fait, la raison pour laquelle je veux introduire l'entropie croisée est d'améliorer la précision du signe. – Wedoso

Répondre

0

Vous pouvez créer votre propre fonction de perte, la caisse keras documentation et source code des idées, mais il devrait être quelque chose comme ceci:

from keras.losses import mean_squared_error, binary_crossentropy 

def my_custom_loss(y_true, y_pred): 
    mse = mean_squared_error(y_true, y_pred) 
    crossentropy = binary_crossentropy(y_true, y_pred) 
    return mse + crossentropy 

... 

model.compile(loss=my_custom_loss, ...) 

Existe aussi le backend API d'utiliser les primitives si vous avez besoin des opérations de tenseur de base

+0

Il y a une erreur: 'TypeError: custom_loss() prend exactement 2 arguments (3 donnés)'. Et je compile le modèle comme ceci 'model.compile (optimizer = 'adam', perte = self.custom_loss, metrics = ['mse'])' – Wedoso

+0

'self' est le troisième paramètre, c'est pourquoi vous donne une erreur –