tf.scan
| Просмотреть исходный код на GitHub |
scan по списку тензоров, распакованных из elems по размерности 0. (устаревшие аргументы)
tf.scan(
fn, elems, initializer=None, parallel_iterations=10, back_prop=True,
swap_memory=False, infer_shape=True, reverse=False, name=None
)
Простейший вариант 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 | (необязательно) Устарело. False отключает поддержку обратного распространения. Вместо этого используйте tf.stop_gradient. |
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])
© 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/scan