Spec-Zone.ru › TensorFlow

tf.math.bincount

Подсчитывает количество вхождений каждого значения в целочисленном массиве.

tf.math.bincount(
    arr,
    weights=None,
    minlength=None,
    maxlength=None,
    dtype=tf.dtypes.int32,
    name=None,
    axis=None,
    binary_output=False
)

Если minlength и maxlength не заданы, возвращается вектор длины tf.reduce_max(arr) + 1, если arr не пуст, и вектор нулевой длины в противном случае.

values = tf.constant([1,1,2,3,2,4,4,5])
tf.math.bincount(values)
<tf.Tensor: ... numpy=array([0, 2, 2, 1, 2, 1], dtype=int32)>

Длина вектора = максимальный элемент в векторе values равен 5. Прибавление 1, то есть 6, даст длину вектора.

Каждое значение в выходном массиве указывает количество вхождений соответствующего индекса. Здесь значение по индексу 1 в выходном массиве равно 2. Это означает, что значение 1 встречается в values два раза.

Подсчёт количества элементов с весами

values = tf.constant([1,1,2,3,2,4,4,5])
weights = tf.constant([1,5,0,1,0,5,4,5])
tf.math.bincount(values, weights=weights)
<tf.Tensor: ... numpy=array([0, 6, 0, 1, 9, 5], dtype=int32)>

Если задан weights, соответствующие бины будут увеличиваться на соответствующий вес, а не на 1. Здесь значение по индексу 1 в выходном массиве равно 6. Это сумма weights, соответствующих значению в values (то есть для индекса 1 первые два значения равны 1, поэтому складываются первые два веса — 1 и 5).

Подсчёт количества элементов с весами эквивалентен unsorted_segement_sum, где data — это веса, а segment_ids — значения.

values = tf.constant([1,1,2,3,2,4,4,5])
weights = tf.constant([1,5,0,1,0,5,4,5])
tf.math.unsorted_segment_sum(weights, values, num_segments=6).numpy()
array([0, 6, 0, 1, 9, 5], dtype=int32)

На GPU bincount с весами поддерживается только при включённом XLA (обычно при использовании функции с декоратором @tf.function(jit_compile=True)). Для обхода этого ограничения в случае GPU без XLA можно использовать unsorted_segment_sum.

Независимый подсчёт элементов в строках матрицы

В этом примере axis=-1 применяется к двумерному входному массиву и возвращает Tensor с подсчётом количества элементов, при котором ось 0 не преобразуется в одномерный массив, то есть подсчёт выполняется независимо для каждой строки матрицы.

data = np.array([[1, 2, 3, 0], [0, 0, 1, 2]], dtype=np.int32)
tf.math.bincount(data, axis=-1)
<tf.Tensor: shape=(2, 4), dtype=int32, numpy=
  array([[1, 1, 1, 1],
         [2, 1, 1, 0]], dtype=int32)>

Подсчёт количества элементов с binary_output

В этом примере возвращается двоичный результат вместо количества вхождений.

data = np.array([[1, 2, 3, 0], [0, 0, 1, 2]], dtype=np.int32)
tf.math.bincount(data, axis=-1, binary_output=True)
<tf.Tensor: shape=(2, 4), dtype=int32, numpy=
  array([[1, 1, 1, 1],
         [1, 1, 1, 0]], dtype=int32)>

Отсутствующие нули в SparseTensor

Обратите внимание, что отсутствующие нули (неявные нули) в SparseTensor НЕ учитываются. Это позволяет обрабатывать такие случаи, как 0 в тензоре значений, указывающий на наличие индекса/идентификатора 0, а отсутствующий ноль — на отсутствие индекса/идентификатора.

Если требуется учитывать отсутствующие нули, можно использовать обходные решения. В случае axis=0 количество отсутствующих нулей можно вычислить, вычтя количество элементов в тензоре values SparseTensor из количества элементов в плотной форме, а затем прибавить эту разницу к первому элементу результата bincount. Во всех случаях перед вызовом tf.math.bincount SparseTensor можно преобразовать в плотный Tensor с помощью tf.sparse.to_dense.

Аргументы
arr Tensor, RaggedTensor или SparseTensor, значения которого нужно подсчитать. Если axis=-1, эти тензоры должны иметь ранг 2.
weights Если значение не None, оно должно иметь ту же форму, что и arr. Для каждого значения в arr соответствующий бин будет увеличен на соответствующий вес, а не на 1.
  1. Если значение не None, binary_output должно быть False.
minlength Если задано, гарантирует, что длина результата будет не меньше minlength; при необходимости в конец добавляются нули.
maxlength Если задано, пропускает значения в arr, равные maxlength или превышающие его, гарантируя, что длина результата будет не больше maxlength.
dtype Если weights имеет значение None, определяет тип выходных бинов.
name Область имён для связанных операций (необязательный параметр).
axis Ось, по которой выполняется разбиение. Оси начиная с axis и ниже преобразуются в одномерный массив перед подсчётом. В настоящее время поддерживаются только 0 и -1. Если значение None, преобразуются в одномерный массив все оси (эквивалентно передаче 0).
binary_output Если True, эта операция возвращает 1 вместо количества вхождений токена (эквивалентно one_hot + reduce_any вместо one_hot + reduce_add). По умолчанию — False.
Возвращает
Вектор с тем же типом данных, что и weights или заданный dtype, содержащий значения подсчёта.
Вызывает исключение
InvalidArgumentError, если на вход переданы отрицательные значения.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/math/bincount

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API