web-dev-qa-db-fra.com

Compter le nombre de valeurs "vraies" dans le tenseur booléen

Je comprends que tf.where renverra les emplacements des valeurs True afin que je puisse utiliser le shape[0] du résultat pour obtenir le nombre de Trues. 

Cependant, lorsque j'essaie d'utiliser ceci, la dimension est inconnue (ce qui est logique car elle doit être calculée au moment de l'exécution). Ma question est donc la suivante: comment puis-je accéder à une dimension et l’utiliser dans une opération comme une somme?

Par exemple:

myOtherTensor = tf.constant([[True, True], [False, True]])
myTensor = tf.where(myOtherTensor)
myTensor.get_shape() #=> [None, 2]
sum = 0
sum += myTensor.get_shape().as_list()[0] # Well defined at runtime but considered None until then.
23
Aidan Gomez

Vous pouvez convertir les valeurs en floats et calculer la somme correspondante: tf.reduce_sum(tf.cast(myOtherTensor, tf.float32))

Selon votre cas d'utilisation réel, vous pouvez également calculer des sommes par ligne/colonne si vous spécifiez les dimensions réduites de l'appel.

36
Rafał Józefowicz

La réponse de Rafal est certainement le moyen le plus simple de compter le nombre d'éléments true dans votre tenseur, mais l'autre partie de votre question vous a demandé:

Comment puis-je accéder à une dimension et l'utiliser dans une opération comme une somme?

Pour ce faire, vous pouvez utiliser les opérations liées à la forme de TensorFlow , qui agissent sur la valeur d'exécution du tenseur. Par exemple, tf.size(t) produit une variable scalaire Tensor contenant le nombre d'éléments dans t et tf.shape(t) produit une variable 1D Tensor contenant la taille de t dans chaque dimension.

En utilisant ces opérateurs, votre programme pourrait également être écrit comme suit:

myOtherTensor = tf.constant([[True, True], [False, True]])
myTensor = tf.where(myOtherTensor)
countTrue = tf.shape(myTensor)[0]  # Size of `myTensor` in the 0th dimension.

sess = tf.Session()
sum = sess.run(countTrue)
5
mrry

Je pense que c'est la façon la plus simple de le faire: 

In [38]: myOtherTensor = tf.constant([[True, True], [False, True]])

In [39]: if_true = tf.count_nonzero(myOtherTensor)

In [40]: sess.run(if_true)
Out[40]: 3
4
lerner

Il existe une fonction tensorflow pour compter les valeurs non nulles tf.count_nonzero . La fonction accepte également les arguments axis et keep_dims.

Voici un exemple simple:

import numpy as np
import tensorflow as tf
a = tf.constant(np.random.random(100))
with tf.Session() as sess:
    print(sess.run(tf.count_nonzero(tf.greater(a, 0.5))))
1
aboettcher