Spec-Zone.ru › TensorFlow

tf.compat.v1.scan

Выполняет scan по списку тензоров, распакованных из elems по измерению 0.

tf.compat.v1.scan(
    fn,
    elems,
    initializer=None,
    parallel_iterations=10,
    back_prop=True,
    swap_memory=False,
    infer_shape=True,
    reverse=False,
    name=None
)

См. также tf.map_fn.

В простейшем варианте 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 (Необязательно) Значение True включает поддержку обратного распространения ошибки.
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])

© 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/scan

Spec-Zone.ru

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