tf.scan
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]) |
© 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/scan