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