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 соответствуют входящим кортежам.
| Args | |
|---|---|
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 | (необязательно) Префикс имени для возвращаемых тензоров. |
| 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])
© 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/compat/v1/scan