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 | (необязательно) 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])
© 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/r1.15/api_docs/python/tf/scan