Этот класс предназначен для использования с примитивами динамической итерации, такими как while_loop и map_fn. Он поддерживает обратное распространение градиента с помощью специальных зависимостей потока управления.
Обратите внимание: хотя массив можно считывать несколько раз, а значения в позициях можно перезаписывать, поведение может быть неопределенным, если сохранять несколько ссылок на один и тот же массив и clear_after_read имеет значение False. В частности, не используйте такие методы, как concat(), чтобы преобразовать промежуточный TensorArray в тензор, а затем продолжить изменять TensorArray, особенно если впоследствии необходимо выполнить обратное распространение через него.
Пример 2: алгоритм вычисления последовательности Фибоначчи, который записывает значения в цикле, а затем возвращает результат.
@tf.function
def fibonacci(n):
ta = tf.TensorArray(tf.float32, size=0, dynamic_size=True)
ta = ta.unstack([0., 1.])
for i in range(2, n):
ta = ta.write(i, ta.read(i - 1) + ta.read(i - 2))
return ta.stack()
fibonacci(7)
<tf.Tensor: shape=(7,), dtype=float32,
numpy=array([0., 1., 1., 2., 3., 5., 8.], dtype=float32)>
Пример 3: простой цикл, взаимодействующий с tf.Variable.
v = tf.Variable(1)
@tf.function
def f(x):
ta = tf.TensorArray(tf.int32, size=0, dynamic_size=True)
for i in tf.range(x):
v.assign_add(i)
ta = ta.write(i, v)
return ta.stack()
f(5)
<tf.Tensor: shape=(5,), dtype=int32, numpy=array([ 1, 2, 4, 7, 11],
dtype=int32)>
Аргументы
dtype
(обязательно) тип данных TensorArray.
size
(необязательно) скаляр int32 Tensor: размер TensorArray. Обязателен, если handle не указан.
dynamic_size
(необязательно) логическое значение Python: если True, операции записи могут увеличить размер TensorArray сверх исходного. Значение по умолчанию: False.
clear_after_read
Логическое значение (необязательно, по умолчанию: True). Если True, значения TensorArray удаляются после чтения. Это отключает возможность многократного чтения, но позволяет раньше освободить память.
tensor_array_name
(необязательно) строка Python: имя TensorArray. Используется при создании дескриптора TensorArray. Если задано это значение, handle должен быть None.
handle
(необязательно) дескриптор Tensor существующего TensorArray. Если задано это значение, tensor_array_name должен быть None. Поддерживается только в режиме графа.
flow
(необязательно) скаляр float Tensor из существующего TensorArray.flow. Поддерживается только в режиме графа.
infer_shape
(необязательно, по умолчанию: True) Если True, включен вывод формы. В этом случае все элементы должны иметь одинаковую форму.
element_shape
(необязательно, по умолчанию: None) объект TensorShape, задающий ограничения на форму каждого элемента TensorArray. Форма может быть задана не полностью.
colocate_with_first_write_call
Если True, TensorArray будет размещен на том же устройстве, что и тензор, использованный при первой записи (к операциям записи относятся write, unstack и split). Если False, TensorArray будет размещен на устройстве, определяемом контекстом устройства, доступным во время его инициализации.
name
Имя операции (необязательно).
Вызывает исключения
ValueError
если указаны и handle, и tensor_array_name.
TypeError
если handle указан, но не является тензором.
Атрибуты
dtype
Тип данных этого TensorArray.
dynamic_size
Логическое значение Python; если True, размер TensorArray может динамически увеличиваться.
Примечание: Результат этой функции необходимо использовать. Если этого не сделать, будет записано предупреждение или может возникнуть ошибка. Чтобы пометить результат как использованный, вызовите его метод .mark_used().
Возвращает TensorArray с теми же содержимым и свойствами.
Возвращает
Новый объект TensorArray с потоком, который гарантирует, что зависимости управления из контекстов станут зависимостями управления для операций записи, чтения и т. д. Используйте этот объект для всех последующих операций.
Распределяет значения Tensor по указанным индексам TensorArray.
Аргументы
indices
1-DTensor со значениями из [0, max_value). Если TensorArray не является динамическим, max_value=size().
value
Тензор ранга N+1 типа dtype. Тензор для распаковки.
name
Имя операции (необязательно).
Возвращает
Новый объект TensorArray с потоком, гарантирующим выполнение операции распределения. Используйте этот объект для всех последующих операций.
Вызывает исключения
ValueError
если не удается вывести форму.
Примечание: Результат этой функции необходимо использовать. Если этого не сделать, будет записано предупреждение или может возникнуть ошибка. Чтобы пометить результат как использованный, вызовите его метод .mark_used().
Разбивает значения Tensor и помещает их в TensorArray.
Аргументы
value
Тензор ранга N+1 типа dtype. Тензор для разбиения.
lengths
Вектор int32 ранга 1 с длинами, используемыми при разбиении value по первому измерению.
name
Имя операции (необязательно).
Возвращает
Новый объект TensorArray с потоком, гарантирующим выполнение операции разбиения. Используйте этот объект для всех последующих операций.
Вызывает исключения
ValueError
если не удается вывести форму.
Примечание: Результат этой функции необходимо использовать. Если этого не сделать, будет записано предупреждение или может возникнуть ошибка. Чтобы пометить результат как использованный, вызовите его метод .mark_used().
Разбирает значения Tensor на отдельные элементы в TensorArray.
Если ранг форм входных значений равен R, элементы выходного TensorArray будут иметь формы ранга (R-1).
Аргументы
value
Тензор ранга N+1 типа dtype. Тензор для разделения на элементы.
name
Имя операции (необязательно).
Возвращает
Новый объект TensorArray с потоком, гарантирующим выполнение операции разбиения на элементы. Используйте этот объект для всех последующих операций.
Вызывает исключения
ValueError
если не удается вывести форму.
Примечание: Результат этой функции необходимо использовать. Если этого не сделать, будет записано предупреждение или может возникнуть ошибка. Чтобы пометить результат как использованный, вызовите его метод .mark_used().
Скаляр int32 нулевого ранга с индексом для записи.
value
Тензор N-го ранга типа dtype. Тензор для записи в эту позицию.
name
Имя операции (необязательно).
Возвращает
Новый объект TensorArray с потоком, гарантирующим выполнение операции записи. Используйте этот объект для всех последующих операций.
Вызывает исключения
ValueError
если записывающих элементов больше, чем указано.
Примечание: Результат этой функции необходимо использовать. Если этого не сделать, будет записано предупреждение или может возникнуть ошибка. Чтобы пометить результат как использованный, вызовите его метод .mark_used().