Qu'est-ce que logits, softmax et softmax_cross_entropy_with_logits?
Je passais par le tensorflow API docs ici. Dans le tensorflow de la documentation, ils ont utilisé un mot clé appelé logits
. Quel est-il? Dans un grand nombre de méthodes dans l'API docs il est écrit comme
tf.nn.softmax(logits, name=None)
Si ce qui est écrit est ceux logits
ne sont Tensors
, pourquoi garder un nom différent comme logits
?
Autre chose, c'est qu'il y a deux méthodes, je ne pouvais pas faire la différence. Ils ont été
tf.nn.softmax(logits, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
Quelles sont les différences entre eux? Les docs ne sont pas claires pour moi. Je sais ce que tf.nn.softmax
n'. Mais pas les autres. Un exemple sera vraiment utile.
Vous devez vous connecter pour publier un commentaire.
Logits signifie simplement que la fonction fonctionne sur le non mis à l'échelle de la sortie des premières couches et que l'échelle relative à comprendre les unités est linéaire. Il signifie, en particulier, la somme des entrées ne peuvent pas égal à 1, que les valeurs sont pas des probabilités que vous pourriez avoir une entrée de 5).
tf.nn.softmax
produit juste le résultat de l'application de la la fonction softmax à une entrée du tenseur. Le softmax "squishes" les entrées de sorte quesum(input) = 1
: c'est une façon de normaliser. La forme de la sortie d'un softmax est le même que l'entrée: il normalise les valeurs. Les sorties de softmax peut être interprétées comme des probabilités.En revanche,
tf.nn.softmax_cross_entropy_with_logits
calcule la croix de l'entropie du résultat après l'application de la fonction softmax (mais elle le fait tous ensemble dans un plus mathématiquement de précaution). Il est similaire au résultat de:La croix entropie est un résumé de la métrique: c'sommes à travers les éléments. La sortie de
tf.nn.softmax_cross_entropy_with_logits
sur une forme[2,5]
tenseur est de la forme[2,1]
(la première dimension est considérée comme le traitement par lot).Si vous voulez faire de l'optimisation pour minimiser le cross-entropie ET vous êtes softmaxing après votre dernière couche, vous devez utiliser
tf.nn.softmax_cross_entropy_with_logits
au lieu de le faire vous-même, car il couvre numériquement instable coin des cas dans les mathématiquement droit chemin. Sinon, vous finirez par le piratage en ajoutant peu epsilons ici et là.Édité 2016-02-07:
Si vous avez une seule étiquettes de classe, où un objet ne peut appartenir qu'à une seule catégorie, vous pouvez envisager d'utiliser
tf.nn.sparse_softmax_cross_entropy_with_logits
de sorte que vous n'avez pas à convertir vos étiquettes à un dense " one-hot tableau. Cette fonction a été ajoutée après la version 0.6.0.cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy)
. Mais quand j'utilise un autre moyen,pred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
le résultat est stable et mieux.tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W, b))
dans votre cas.b
doit être en dehors de la fourchette,tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W), b)
Version courte:
Supposons que vous avez deux tenseurs, où
y_hat
contient calculé des scores pour chaque classe (par exemple, à partir de y = W*x +b) ety_true
contient un chaud codé vrai étiquettes.Si vous interpréter les notes de
y_hat
comme unnormalized journal des probabilités, alors qu'ils sont logits.En outre, le total de l'entropie croisée calculé de cette manière:
est essentiellement l'équivalent du total de la croix-entropie calculée avec la fonction
softmax_cross_entropy_with_logits()
:Version longue:
Dans la couche de sortie de votre réseau de neurones, vous aurez probablement calculer un tableau qui contient la classe des scores pour chacun de vos instances de formation, comme à partir d'un calcul
y_hat = W*x + b
. Pour servir d'exemple, ci-dessous, j'ai créé uny_hat
de 2 x 3 tableau, où les lignes correspondent à la formation des instances et les colonnes correspondent à des classes. Donc, ici, il y a 2 formation des instances et 3 classes.Remarque que les valeurs ne sont pas normalisées (c'est à dire les lignes de ne pas ajouter jusqu'à 1). Afin de les normaliser, nous pouvons appliquer la fonction softmax, qui interprète l'entrée comme unnormalized journal des probabilités (aka logits) et les sorties normalisées linéaire des probabilités.
Il est important de bien comprendre ce que l'softmax de sortie, c'est dire. Ci-dessous, j'ai montré un tableau plus clair représente la sortie ci-dessus. Il peut être vu que, par exemple, la probabilité de formation de l'instance 1 "Classe 2" est 0.619. La classe de probabilités pour chaque formation de l'instance sont normalisées, de sorte que la somme de chaque ligne est de 1,0.
Alors maintenant, nous avons la classe probabilités pour chaque formation de l'instance, où l'on peut prendre le argmax() de chaque ligne pour générer un classement final. À partir de ci-dessus, on peut générer que de la formation de l'instance 1 appartient à la "Classe 2" et de la formation de l'instance 2 appartient à la "Classe 1".
Sont ces classifications correctes? Nous avons besoin de mesurer contre le vrai étiquettes à partir de l'ensemble de la formation. Vous aurez besoin d'un "one-hot" codé
y_true
tableau, où encore une fois les lignes sont des instances de formation et les colonnes sont des classes. Ci-dessous, j'ai créé un exempley_true
"one-hot" tableau où la véritable label pour la formation de l'instance 1 est de "Classe 2" et la véritable label pour la formation de l'instance 2 est de "Classe 3".Est la distribution de probabilité dans
y_hat_softmax
proche de la distribution de probabilité dansy_true
? Nous pouvons utiliser entropie croisée de mesurer l'erreur.Nous pouvons calculer l'entropie croisée sur une ligne sage de base et voir les résultats. Ci-dessous, nous pouvons voir que la formation à l'exemple 1 a une perte de 0.479, tandis que la formation de l'instance de 2 a plus de perte de 1.200. Ce résultat est logique car dans notre exemple ci-dessus,
y_hat_softmax
a montré que la formation de l'instance 1 de la probabilité la plus élevée était de "Classe 2", qui correspond à la formation de l'instance 1 dansy_true
; toutefois, la prévision pour la formation de l'instance 2 ont montré une plus grande probabilité de "Classe 1", ce qui ne correspond pas à la vraie classe "Classe 3".Ce que nous voulons vraiment, c'est la perte totale sur toutes les instances de formation. On peut donc calculer:
À l'aide de softmax_cross_entropy_with_logits()
On peut, au lieu de calculer le total de la croix entropie à l'aide de la
tf.nn.softmax_cross_entropy_with_logits()
fonction, comme illustré ci-dessous.Noter que
total_loss_1
ettotal_loss_2
produire essentiellement des résultats équivalents avec quelques légères différences dans la finale chiffres. Cependant, vous pourriez aussi bien utiliser la deuxième approche: il faut une moindre ligne de code et accumule le moins d'erreur numérique parce que le softmax est fait pour vous à l'intérieur desoftmax_cross_entropy_with_logits()
.tf.nn.softmax
calcule la propagation de l'avant par l'intermédiaire d'un softmax couche. Vous l'utilisez pendant évaluation du modèle lorsque vous calculez les probabilités que les sorties du modèle.tf.nn.softmax_cross_entropy_with_logits
calcule le coût d'un softmax couche. Il est uniquement utilisé lors de formation.Les logits sont les unnormalized journal des probabilités de sortie du modèle (les valeurs de sortie avant la softmax la normalisation est appliquée).
tf.nn.softmax_cross_entropy_with_logits
est d'évaluer combien le modèle s'écarte de l'or, des étiquettes, de ne pas fournir un normalisée de sortie.tf.nn.sparse_softmax_cross_entropy_with_logits
. Pour obtenir les probabilités d'utilisertf.nn.softmax
.Réponses ci-dessus ont assez de description pour la question posée.
Ajoutant à cela, Tensorflow a optimisé le fonctionnement de l'application de la fonction d'activation, puis en calculant les coûts à l'aide de sa propre activation suivie par des fonctions de coût. Par conséquent, il est une bonne pratique à utiliser:
tf.nn.softmax_cross_entropy()
surtf.nn.softmax(); tf.nn.cross_entropy()
Vous pouvez trouver de différence importante entre eux dans une exploitation intensive des ressources de modèle.
tf.nn.softmax
suivi detf.losses.softmax_cross_entropy
?