Contar el número de valores" Verdaderos " en el tensor booleano


Entiendo que tf.where devolverá las ubicaciones de los valores True, de modo que podría usar el resultado shape[0] para obtener el número de Trues.

Sin embargo, cuando intento usar esto, la dimensión es desconocida (lo cual tiene sentido ya que necesita ser computada en tiempo de ejecución). Así que mi pregunta es, ¿cómo puedo acceder a una dimensión y usarla en una operación como una suma?

Por ejemplo:

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.
Author: Valijon, 2016-01-04

4 answers

Puede convertir los valores en flotadores y calcular la suma en ellos: tf.reduce_sum(tf.cast(myOtherTensor, tf.float32))

Dependiendo de su caso de uso real, también puede calcular sumas por fila/columna si especifica las dimensiones de reducción de la llamada.

 35
Author: Rafał Józefowicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-04 20:23:49

La respuesta de Rafal es casi con toda seguridad la forma más sencilla de contar el número de true elementos en tu tensor, pero la otra parte de tu pregunta es:

[H] ¿cómo puedo acceder a una dimensión y usarla en una operación como una suma?

Para hacer esto, puede usar las operaciones relacionadas con la forma de TensorFlow, que actúan sobre el valor de tiempo de ejecución del tensor. Por ejemplo, tf.size(t) produce un escalar Tensor que contiene el número de elementos en t, y tf.shape(t) produce un 1D Tensor que contiene el tamaño de t en cada dimensión.

Usando estos operadores, su programa también podría escribirse como:

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
Author: mrry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-05 05:00:11

Creo que esta es la forma más fácil de hacerlo:

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
 3
Author: lerner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-16 08:18:35

Hay una función tensorflow para contar valores distintos de cerotf.count_nonzero. La función también acepta los argumentos axis y keep_dims.

Aquí hay un ejemplo 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))))
 0
Author: aboettcher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-20 08:27:44