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])
© 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/compat/v1/scan