web-dev-qa-db-fra.com

Concordance de classement: le classement des étiquettes (2 reçues) doit être égal au rang des logits moins 1 (2)

Je construis DNN pour prédire si l'objet est présent dans l'image ou non. Mon réseau a deux couches cachées et la dernière couche ressemble à ceci:

  # Output layer
  W_fc2 = weight_variable([2048, 1])
  b_fc2 = bias_variable([1])

  y = tf.matmul(h_fc1, W_fc2) + b_fc2

Ensuite, j'ai un espace réservé pour les étiquettes:

y_ = tf.placeholder(tf.float32, [None, 1], 'Output')

Je cours par lots (par conséquent, le premier argument de la forme du calque de sortie est Aucun). 

J'utilise la fonction de perte suivante:

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
    y[:, :1], y_[:, :1], name='xentropy')
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
predict_hand = tf.greater(y, 0.5)
correct_prediction = tf.equal(tf.to_float(predict_hand), y_)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

Mais au runtime j'ai eu l'erreur suivante:

Incohérence de rang: le rang des étiquettes (2 reçues) doit être égal au rang des logits moins 1 (reçu 2).

Je suppose que je devrais remodeler la couche d'étiquettes, mais je ne suis pas sûr de ce à quoi elle s'attend. J'ai cherché dans documentation et il est écrit:

logits: Probabilités de journal de rang r et de forme non échelonnées [d_0, d_1, ..., d_ {r-2}, num_classes] et dtype float32 ou float64. étiquettes: Tenseur de shape [d_0, d_1, ..., d_ {r-2}] et dtype int32 ou int64. Chaque entrée dans les étiquettes doivent être un index dans [0, num_classes).

Si je n'ai qu'une seule classe, à quoi mes étiquettes devraient-elles ressembler (maintenant c'est seulement 0 ou 1)? Toute aide appréciée

6
Pavel Podlipensky

Dans la documentation * pour tf.nn.sparse_softmax_cross_entropy_with_logits

"Un cas d'utilisation courant consiste à avoir des logits de forme [batch_size, Num_classes] et des étiquettes de forme [batch_size]. Mais les dimensions supérieures Sont prises en charge."

Je suppose donc que le tenseur de vos étiquettes doit être de forme [None]. Notez qu'un tenseur donné ayant la forme [None, 1] ou la forme [None] contiendra le même nombre d'éléments.

Exemple d’entrée avec des valeurs factices concrètes:

>>> logits = np.array([[11, 22], [33, 44], [55, 66]])
>>> labels = np.array([1, 0, 1])

Dans le mini-lot où il y a 3 exemples, la logits du premier exemple est 11 et 22 et il y a 2 classes: 0 et 1.

* https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits

6

Le problème peut être la fonction d'activation de votre réseau. Utilisez tf.nn.softmax_cross_entropy_with_logits au lieu de sparse_softmax. Cela résoudra le problème.

4
Rubens_Z

En bref, en voici les outils

    cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
            logits=hypothesis,labels=tf.argmax(Y,1)))

sparse_softmax_cross_entropy_with_logits

Calcule l'entropie croisée softmax clairsemée entre les logits et les étiquettes.

Mesure l'erreur de probabilité dans les tâches de classification discrètes dans dont les classes sont mutuellement exclusives (chaque entrée est exactement une classe ). 

Par exemple, chaque image CIFAR-10 est identifiée par une et une seule étiquette Une image peut être un chien ou un camion, mais pas les deux.

Remarque: pour cette opération, la probabilité d'une étiquette donnée est Considérée comme exclusive. C'est-à-dire que les classes logicielles ne sont pas autorisées, et le vecteur étiquettes doit fournir un seul index spécifique pour le vraie classe pour chaque rangée de logits (chaque entrée de minibatch). 

Pour classification softmax soft} avec une distribution de probabilité pour chaque entrée, voir softmax_cross_entropy_with_logits.

AVERTISSEMENT: Cette opération attend des logits non échelonnés, car elle effectue un softmax sur logits en interne pour l'efficacité. N'appelez pas cette opération avec le sortie de softmax, car cela produira des résultats incorrects.

Un cas d'utilisation courant consiste à avoir des logits de forme [batch_size, num_classes] et des étiquettes de forme [batch_size]. Mais les dimensions supérieures sont supportées.

Notez que pour éviter toute confusion, il est obligatoire de ne transmettre que le nom arguments à cette fonction.

softmax_cross_entropy_with_logits_v2 et softmax_cross_entropy_with_logits

Calcule l'entropie croisée softmax entre les logits et les étiquettes. (obsolète)

CETTE FONCTION IS est dépréciée. Il sera supprimé dans une future version. 

Instructions pour la mise à jour:

Les futures versions majeures de TensorFlow permettront aux gradients de s’écouler dans les étiquettes saisies sur backprop par défaut. La rétropropagation aura lieu seulement dans logits. Pour calculer une perte d'entropie croisée qui permet backpropagation dans les logits et les labels, voir softmax_cross_entropy_with_logits_v2

Mesure l'erreur de probabilité dans les tâches de classification discrètes dans dont les classes sont mutuellement exclusives (chaque entrée est dans exactement une classe ). 

Par exemple, chaque image CIFAR-10 est identifiée par un et un seul étiquette: une image peut être un chien ou un camion, mais pas les deux.

voici les mêmes implémentations de softmax_cross_entropy_with_logits_v2

    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
            logits=hypothesis,labels=Y))
1
Hong Cheng

Pourquoi devrais-je

"Un cas d'utilisation courant consiste à avoir des logits de forme [batch_size, num_classes] et des étiquettes de forme [batch_size]. Mais les dimensions supérieures sont prises en charge."

Dans de nombreux tutoriels, y compris ici et ici , les étiquettes ont la taille [None,10] et les logits ont également la taille [None,10].

1
Nicky Lim