Comment écrire une fonction de perte personnalisée dans Tensorflow?

je suis nouveau sur tensorflow. Je veux écrire ma propre fonction de perte personnalisée. Est-il un tutoriel à ce sujet? Par exemple, la perte de charnière ou un sum_of_square_loss(bien que ce soit déjà dans tf)? Puis-je le faire directement en python ou je dois écrire le rpc code?

23
demandé sur Gu Wang 2016-01-19 14:44:35

4 réponses

regardez ajout D'une nouvelle Op

Il peut ne pas être exactement ce dont vous avez besoin, cependant, il devrait vous donner assez pour commencer.


Prérequis:


Si vous souhaitez intégrer une opération qui n'est pas couvert par la bibliothèque existante, vous peut créer une opération personnalisée. pour incorporer votre opération personnalisée, vous aurez besoin de:

  • Enregistrer la nouvelle Op dans un fichier C++. L'enregistrement du Po est indépendant de la mise en œuvre et décrit la sémantique de la façon dont le Po est invoqué. Par exemple, il définit l'Op nom, et spécifie ses entrées et sorties.
  • implémenter L'Op en C++. Cette implémentation est appelée un "noyau", et il peut y avoir plusieurs noyaux pour différentes architectures (par exemple, CPUs, GPUs).) ou types d'entrées / sorties.

  • créer un emballage Python. Ce wrapper est L'API publique pour créer L'Op. un wrapper par défaut est généré à partir de L'enregistrement Op, qui peut être utilisé directement ou ajouté.

  • Éventuellement, écrire une fonction pour calculer les gradients de l'Op.

  • en option, écrivez une fonction qui décrit les formes d'entrée et de sortie pour L'option. cela permet à l'inférence de forme de fonctionner avec votre Op.

  • tester L'Op, typiquement en Python. Si vous définissez des gradients, vous pouvez vérifier avec le Python GradientChecker.

3
répondu Guy Coder 2017-04-16 17:24:12

nous devons noter la fonction de perte. Par exemple, nous pouvons utiliser l'erreur quadratique moyenne de base comme notre fonction de perte pour y prédite et Y_ cible:

 loss_mse = 1/n(Sum((y-y_)^2))

il y a des fonctions de base pour les tenseurs comme tf.add(x,y), tf.sub(x,y),tf.square(x),tf.reduce_sum(x), etc.

alors nous pouvons définir notre fonction de perte dans Tensorflow comme:

cost = tf.reduce_mean(tf.square(tf.sub(y,y_)))

Remarque: y et y_ sont des tenseurs.

de plus, nous pouvons définir d'autres fonctions de perte si nous pouvons écrire équation. Pour certains opérateurs de formation (minimisateurs), la fonction de perte devrait satisfaire à certaines conditions (lisse, différenciable ...).

en un mot, Tensorflow définit des tableaux, des constantes, des variables en tenseurs, définit des calculs en utilisant des fonctions tf, et utilise session pour exécuter graph. On peut définir ce qu'on veut et le lancer à la fin.

38
répondu Q.Liu 2016-06-01 15:58:28

en plus de l'autre réponse, vous pouvez écrire une fonction de perte en Python si elle peut être représentée comme une composition de fonctions existantes.

regardez, par exemple, l'implémentation de sigmoid_cross_entropy_with_logitslien, qui est implémentée en utilisant des transformations de base.

12
répondu Rafał Józefowicz 2016-01-19 13:11:06

presque dans tous les tutoriels tensorflow ils utilisent des fonctions personnalisées. Par exemple, dans le très début du tutoriel ils écrivent une fonction personnalisée:

somme des carrés des deltas entre le modèle actuel et les données fournies

squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)

Dans les MNIST pour les débutants ils utilisent une entropie croisée:

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

Comme vous le voyez il n'est pas difficile du tout: il vous suffit d'encoder votre fonctionnent dans un format tenseur et utilisent leurs fonctions de base.

Par exemple, voici comment vous pouvez implémenter F-beta score (une approche générale de l' score F1). Sa formule est la suivante:

enter image description here

La seule chose que nous devons faire est de trouver comment calculer true_positive, false_positive, false_negative booléenne ou 0/1 valeurs. Si vous avez des vecteurs de valeurs 0/1, vous pouvez calculer chacune des valeurs comme:

TP = tf.count_nonzero(actual, predicted)
FP = tf.count_nonzero((actual - 1) * predicted)
FN = tf.count_nonzero((predicted - 1) * actual)

Maintenant, une fois que vous savez ces valeurs, vous pouvez facilement obtenir votre

denom = (1 + b**2) * TP + b**2 TN + FP
Fb = (1 + b**2) * TP / denom
7
répondu Salvador Dali 2017-05-14 05:16:22