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 соответствуют входным кортежам.
| Аргументы | |
|---|---|
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 | (необязательно) Префикс имени для возвращаемых тензоров. |
| Возвращаемое значение | |
|---|---|
Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор упаковывает результаты применения 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/compat/v1/scan