Подтвердить что ты не робот

Количество отсчетов "True" в булевом тензоре

Я понимаю, что tf.where вернет расположение значений True, чтобы я мог использовать результат shape[0], чтобы получить число True s.

Однако, когда я пытаюсь использовать это, измерение неизвестно (что имеет смысл, поскольку его необходимо вычислить во время выполнения). Поэтому мой вопрос: как я могу получить доступ к измерению и использовать его в операции, например, в виде суммы?

Например:

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

Ответ 1

Вы можете присвоить значения плавающим и вычислить сумму на них: tf.reduce_sum(tf.cast(myOtherTensor, tf.float32))

В зависимости от вашего фактического использования вы также можете вычислять суммы в строке/столбце, если вы указываете уменьшенные размеры вызова.

Ответ 2

Ответ Рафаля - почти наверняка самый простой способ подсчитать количество элементов true в вашем тензоре, но другая часть вашего вопроса задала вопрос:

[H] ow я могу получить доступ к размеру и использовать его в операции вроде суммы?

Для этого вы можете использовать TensorFlow операции с фигурой, которые действуют на значение времени выполнения тензора. Например, tf.size(t) создает скаляр Tensor, содержащий количество элементов в t, и tf.shape(t) создает 1D Tensor, содержащий размер t в каждом измерении.

Используя эти операторы, ваша программа также может быть записана как:

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)

Ответ 3

Я думаю, что это самый простой способ сделать это:

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

Существует функция tensorflow для подсчета ненулевых значений tf.count_nonzero. Функция также принимает аргументы axis и keep_dims.

Вот простой пример:

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