Spec-Zone.ru › TensorFlow

tf.compat.v1.gather

Извлечение фрагментов из params по оси axis согласно индексам. (устаревшие аргументы)

tf.compat.v1.gather(
    params, indices, validate_indices=None, name=None, axis=None, batch_dims=0
)

Использовано в ноутбуках

Использовано в учебниках
  • Линейная регрессия с эффектами смешанных моделей в {TF Probability, R, Stan}
Устаревшее: НЕКОТОРЫЕ АРГУМЕНТЫ УСТАРЕЛИ: (validate_indices). Они будут удалены в будущей версии. Инструкции по обновлению: Аргумент validate_indices не оказывает влияния. Индексы всегда проверяются на ЦП и никогда не проверяются на графическом процессоре.

Извлечение фрагментов из params по оси axis согласно indices. indices должен быть целочисленным тензором любой размерности (часто 1-мерным).

Tensor.getitem работает для скаляров, tf.newaxis и python-срезы

tf.gather расширяет индексирование для обработки тензоров индексов.

В самом простом случае это идентично индексированию скаляром:

params = tf.constant(['p0', 'p1', 'p2', 'p3', 'p4', 'p5'])
params[3].numpy()
b'p3'
tf.gather(params, 3).numpy()
b'p3'

Наиболее распространённый случай — передача одноосного тензора индексов (это невозможно выразить как python-срез, так как индексы не последовательные):

indices = [2, 0, 2, 5]
tf.gather(params, indices).numpy()
array([b'p2', b'p0', b'p2', b'p5'], dtype=object)

Индексы могут иметь любую форму. Когда у params есть 1 ось, форма выходного тензора равна форме входного тензора:

tf.gather(params, [[2, 0], [2, 5]]).numpy()
array([[b'p2', b'p0'],
       [b'p2', b'p5']], dtype=object)

У params также может быть любая форма. gather может выбирать фрагменты по любой оси в зависимости от аргумента axis (по умолчанию 0). Ниже он используется для сбора первых строк, а затем столбцов из матрицы:

params = tf.constant([[0, 1.0, 2.0],
                      [10.0, 11.0, 12.0],
                      [20.0, 21.0, 22.0],
                      [30.0, 31.0, 32.0]])
tf.gather(params, indices=[3,1]).numpy()
array([[30., 31., 32.],
       [10., 11., 12.]], dtype=float32)
tf.gather(params, indices=[2,1], axis=1).numpy()
array([[ 2.,  1.],
       [12., 11.],
       [22., 21.],
       [32., 31.]], dtype=float32)

Более общее правило: форма выходного тензора такая же, как у входного, но ось индексирования заменяется формой индексов.

def result_shape(p_shape, i_shape, axis=0):
  return p_shape[:axis] + i_shape + p_shape[axis+1:]

result_shape([1, 2, 3], [], axis=1)
[1, 3]
result_shape([1, 2, 3], [7], axis=1)
[1, 7, 3]
result_shape([1, 2, 3], [7, 5], axis=1)
[1, 7, 5, 3]

Вот несколько примеров:

params.shape.as_list()
[4, 3]
indices = tf.constant([[0, 2]])
tf.gather(params, indices=indices, axis=0).shape.as_list()
[1, 2, 3]
tf.gather(params, indices=indices, axis=1).shape.as_list()
[4, 1, 2]
params = tf.random.normal(shape=(5, 6, 7, 8))
indices = tf.random.uniform(shape=(10, 11), maxval=7, dtype=tf.int32)
result = tf.gather(params, indices, axis=2)
result.shape.as_list()
[5, 6, 10, 11, 8]

Это потому, что каждый индекс берёт срез из params и помещает его в соответствующее место в выходном тензоре. Для примера выше

# For any location in indices
a, b = 0, 1
tf.reduce_all(
    # the corresponding slice of the result
    result[:, :, a, b, :] ==
    # is equal to the slice of `params` along `axis` at the index.
    params[:, :, indices[a, b], :]
).numpy()
True

Бэтчинг:

Аргумент batch_dims позволяет собирать разные элементы из каждого элемента в бэтче.

Использование batch_dims=1 эквивалентно наличию внешнего цикла по первой оси params и indices:

params = tf.constant([
    [0, 0, 1, 0, 2],
    [3, 0, 0, 0, 4],
    [0, 5, 0, 6, 0]])
indices = tf.constant([
    [2, 4],
    [0, 4],
    [1, 3]])
tf.gather(params, indices, axis=1, batch_dims=1).numpy()
array([[1, 2],
       [3, 4],
       [5, 6]], dtype=int32)

Это эквивалентно:

def manually_batched_gather(params, indices, axis):
  batch_dims=1
  result = []
  for p,i in zip(params, indices):
    r = tf.gather(p, i, axis=axis-batch_dims)
    result.append(r)
  return tf.stack(result)
manually_batched_gather(params, indices, axis=1).numpy()
array([[1, 2],
       [3, 4],
       [5, 6]], dtype=int32)

Более высокие значения batch_dims эквивалентны нескольким вложенным циклам по внешним осям params и indices. Таким образом, общая функция формы

def batched_result_shape(p_shape, i_shape, axis=0, batch_dims=0):
  return p_shape[:axis] + i_shape[batch_dims:] + p_shape[axis+1:]

batched_result_shape(
    p_shape=params.shape.as_list(),
    i_shape=indices.shape.as_list(),
    axis=1,
    batch_dims=1)
[3, 2]
tf.gather(params, indices, axis=1, batch_dims=1).shape.as_list()
[3, 2]

Это естественным образом возникает, если вам нужно использовать индексы операции, такие как tf.argsort или tf.math.top_k, где последняя размерность индексов индексирует последнюю размерность входного тензора в соответствующей позиции. В этом случае вы можете использовать tf.gather(values, indices, batch_dims=-1).

См. также:

  • tf.Tensor.getitem: Операция прямого индексирования тензора (t[]), обрабатывает скаляры и python-срезы tensor[..., 7, 1:-1]
  • tf.scatter: Коллекция операций, похожих на __setitem__ (t[i] = x)
  • tf.gather_nd: Операция, похожая на tf.gather, но собирает по нескольким осям одновременно (она может собирать элементы матрицы вместо строк или столбцов)
  • tf.boolean_mask, tf.where: Бинарное индексирование.
  • tf.slice и tf.strided_slice: Для доступа на более низком уровне к реализации обработки python-срезов в __getitem__ (t[1:-1:2])
Аргументы
params Тензор, из которого собираются значения. Должен иметь не менее axis + 1 осей.
indices Индексы для сбора. Должен быть одного из типов: int32, int64. Значения должны быть в пределах [0, params.shape[axis]).
validate_indices Устаревший, не делает ничего. Индексы всегда проверяются на ЦП, никогда не проверяются на графическом процессоре.
Внимание: На ЦП, если найден индекс вне диапазона, генерируется ошибка. На графическом процессоре, если найден индекс вне диапазона, в соответствующее значение выходного тензора записывается 0.
axis Ось. Должен быть одного из типов: int32, int64. Ось в params, с которой собираются значения indices. Должен быть не меньше, чем batch_dims. По умолчанию первая ось, не являющаяся осью бэтча. Поддерживаются отрицательные индексы.
batch_dims Количество осей бэтча. Должно быть меньше или равно rank(indices).
name Имя операции (необязательно).
Возвращаемое значение
Тензор Tensor. Имеет тот же тип, что и params.

© 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/compat/v1/gather

Spec-Zone.ru

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