Je commence à utiliser tensorflow (provenant de Caffe) et j'utilise le code de perte sparse_softmax_cross_entropy_with_logits
. La fonction accepte des étiquettes telles que 0,1,...C-1
au lieu des encodages onehot. Maintenant, je veux utiliser une pondération en fonction de l'étiquette de la classe; Je sais que cela pourrait être fait peut-être avec une multiplication de matrice si j'utilise softmax_cross_entropy_with_logits
(un encodage à chaud), Y at-il un moyen de faire la même chose avec sparse_softmax_cross_entropy_with_logits
?
import tensorflow as tf
import numpy as np
np.random.seed(123)
sess = tf.InteractiveSession()
# let's say we have the logits and labels of a batch of size 6 with 5 classes
logits = tf.constant(np.random.randint(0, 10, 30).reshape(6, 5), dtype=tf.float32)
labels = tf.constant(np.random.randint(0, 5, 6), dtype=tf.int32)
# specify some class weightings
class_weights = tf.constant([0.3, 0.1, 0.2, 0.3, 0.1])
# specify the weights for each sample in the batch (without having to compute the onehot label matrix)
weights = tf.gather(class_weights, labels)
# compute the loss
tf.losses.sparse_softmax_cross_entropy(labels, logits, weights).eval()
Spécifiquement pour la classification binaire, il existe weighted_cross_entropy_with_logits
, qui calcule l'entropie croisée softmax pondérée.
sparse_softmax_cross_entropy_with_logits
est suivi pour une opération non pondérée à haute efficacité (voir SparseSoftmaxXentWithLogitsOp
qui utilise SparseXentEigenImpl
sous le capot), elle n'est donc pas "enfichable".
Dans les cas multi-classes, votre option est soit de passer au codage one-hot, soit d’utiliser la fonction tf.losses.sparse_softmax_cross_entropy
loss de manière simplifiée, comme déjà suggéré, où vous devrez passer les poids en fonction des étiquettes d’un lot en cours. .
Les poids de classe sont multipliés par les logits, de sorte que cela fonctionne toujours pour sparse_softmax_cross_entropy_with_logits. Reportez-vous à cette solution pour "Fonction de perte pour le classifieur binaire déséquilibré de classe dans le flux Tensor".
En remarque, vous pouvez passer des poids directement dans sparse_softmax_cross_entropy
tf.contrib.losses.sparse_softmax_cross_entropy(logits, labels, weight=1.0, scope=None)
Cette méthode est pour la perte d'entropie croisée en utilisant
tf.nn.sparse_softmax_cross_entropy_with_logits.
Le poids agit comme un coefficient pour la perte. Si un scalaire est fourni, la perte est simplement réduite à la valeur donnée. Si le poids est un tenseur de taille [batch_size], les poids de perte s'appliquent à chaque échantillon correspondant.