Spec-Zone.ru › TensorFlow 2.9

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 (необязательно) Префикс имени для возвращаемых тензоров.
Returns
Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор упаковывает результаты применения fn к тензорам, распакованным из elems по первой размерности, и предыдущему(и) значению(ям) накопителя, от первого к последнему (или с последнего к первому, если reverse=True).
Raises
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])

© 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/versions/r2.9/api_docs/python/tf/scan

Spec-Zone.ru

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