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, соответствующий бин будет увеличен на соответствующий вес, а не на
|
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