Spec-Zone.ru › TensorFlow 2.3

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 соответствуют входным кортежам.

Аргументы
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.3/api_docs/python/tf/scan

Spec-Zone.ru

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