Spec-Zone.ru › TensorFlow 2.4

tf.scan

Просмотреть исходный код на GitHub

scan по списку тензоров, распакованных из elems по размерности 0. (устаревшие аргументы)

tf.scan(
    fn, elems, initializer=None, parallel_iterations=10, back_prop=True,
    swap_memory=False, infer_shape=True, reverse=False, name=None
)
Предупреждение: НЕКОТОРЫЕ ЗНАЧЕНИЯ АРГУМЕНТОВ УСТАРЕЛИ: (back_prop=False). Они будут удалены в будущей версии. Инструкции по обновлению: back_prop=False устарел. Рассмотрите использование tf.stop_gradient вместо него. Вместо: results = tf.scan(fn, elems, back_prop=False) Используйте: results = tf.nest.map_structure(tf.stop_gradient, tf.scan(fn, elems))

Простейшая версия scan многократно применяет вызываемый объект fn к последовательности элементов от первого до последнего. Элементы состоят из тензоров, распакованных из elems по размерности 0. Вызываемый объект fn принимает два тензора в качестве аргументов. Первый аргумент — это накопленное значение, вычисленное из предыдущего вызова fn, а второй — значение в текущей позиции elems. Если initializer равно None, elems должно содержать по крайней мере один элемент, и его первый элемент используется в качестве инициализатора.

Предположим, что elems распаковывается в values, список тензоров. Форма тензора результата — [len(values)] + fn(initializer, values[0]).shape. Если reverse=True, это fn(initializer, values[-1]).shape.

Этот метод также поддерживает многоаргументные elems и аккумулятор. Если elems представляет собой (возможно, вложенный) список или кортеж тензоров, то каждый из этих тензоров должен иметь соответствующую первую размерность (распаковку). Второй аргумент fn должен соответствовать структуре elems.

Если не указан initializer, предполагается, что структура вывода и типы данных fn совпадают со входными данными; в этом случае первый аргумент fn должен соответствовать структуре elems.

Если указан initializer, то вывод fn должен иметь ту же структуру, что и initializer; и первый аргумент fn должен соответствовать этой структуре.

Например, если elems равен (t1, [t2, t3]) и initializer равен [i1, i2], то подходящая сигнатура для fn в python2 равна: fn = lambda (acc_p1, acc_p2), (t1, [t2, t3]): и fn должны возвращать список, [acc_n1, acc_n2]. Альтернативная правильная сигнатура для fn, и та, которая работает в python3, выглядит так: fn = lambda a, t:, где a и t соответствуют входным кортежам.

Args
fn Вызываемый объект для выполнения. Он принимает два аргумента. Первый будет иметь ту же структуру, что и initializer при его указании, иначе — ту же структуру, что и elems. Второй будет иметь ту же (возможно, вложенную) структуру, что и elems. Его вывод должен иметь ту же структуру, что и initializer при его указании, иначе — ту же структуру, что и elems.
elems Тензор или (возможно, вложенная) последовательность тензоров, каждый из которых будет распакован вдоль своей первой размерности. Вложенная последовательность полученных срезов будет первым аргументом для fn.
initializer (необязательно) Тензор или (возможно, вложенная) последовательность тензоров, начальное значение для аккумулятора и ожидаемый тип данных вывода fn.
parallel_iterations (необязательно) Количество итераций, разрешенных для одновременного выполнения.
back_prop (необязательно) Устарело. False отключает поддержку обратного распространения. Вместо этого предпочтительнее использовать tf.stop_gradient.
swap_memory (необязательно) True включает обмен данными между GPU и CPU.
infer_shape (необязательно) False отключает тесты на согласованность форм вывода.
reverse (необязательно) True сканирует тензор справа налево (вместо слева направо).
name (необязательно) Префикс имени для возвращаемых тензоров.
Возвращаемое значение
Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор содержит результаты применения fn к тензорам, распакованным из elems по первой размерности, и предыдущим значениям аккумулятора, слева направо (или справа налево, если reverse=True).
Исключения
TypeError если fn не является вызываемым объектом или структура вывода fn и initializer не совпадают.
ValueError если длины вывода fn и initializer не совпадают.

Примеры:

elems = np.array([1, 2, 3, 4, 5, 6])
sum = scan(lambda a, x: a + x, elems)
# sum == [1, 3, 6, 10, 15, 21]
sum = scan(lambda a, x: a + x, elems, reverse=True)
# sum == [21, 20, 18, 15, 11, 6]
elems = np.array([1, 2, 3, 4, 5, 6])
initializer = np.array(0)
sum_one = scan(
    lambda a, x: x[0] - x[1] + a, (elems + 1, elems), initializer)
# sum_one == [1, 2, 3, 4, 5, 6]
elems = np.array([1, 0, 0, 0, 0, 0])
initializer = (np.array(0), np.array(1))
fibonaccis = scan(lambda a, _: (a[1], a[0] + a[1]), elems, initializer)
# fibonaccis == ([1, 1, 2, 3, 5, 8], [1, 2, 3, 5, 8, 13])

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/scan

Spec-Zone.ru

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