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.4/api_docs/python/tf/compat/v1/scan