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 True
s.
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.
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.
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)
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
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))))
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