web-dev-qa-db-fra.com

Comment puis-je implémenter une perte d'entropie croisée pondérée dans le flux tenseur à l'aide de sparse_softmax_cross_entropy_with_logits

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?

8
Roger Trullo
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()
14
mauna

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

2
Maxim

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.

1
Alexa Greenberg