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 не пуст, и длиной 0 в противном случае.

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)). unsorted_segment_sum можно использовать как обходной путь для случая без XLA на GPU.

Подсчёт бинов строк матрицы независимо

Этот пример использует 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 в тензоре значений указывает, что индекс/id 0 присутствует, а отсутствующий ноль указывает на то, что индекс/id отсутствует.

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

Args
arr A Tensor, RaggedTensor или SparseTensor, значения которого должны быть подсчитаны. Эти тензоры должны иметь ранг 2, если axis=-1.
weights Если не None, должен иметь такую же форму, как arr. Для каждого значения в arr, соответствующий бин будет увеличен на соответствующий вес, а не на
  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, содержащий значения bincount.
Исключения
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