Этот класс предназначен для использования с динамическими итерационными примитивами, такими как while_loop и map_fn. Он поддерживает обратное распространение градиента с помощью специальных зависимостей потока управления.
Пример 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 bool: если True, записи в TensorArray могут увеличить размер TensorArray за пределы его начального значения. По умолчанию: False.
clear_after_read
Булево (необязательно, по умолчанию: True). Если True, значения TensorArray очищаются после чтения. Это отключает семантику read-many, но позволяет раньше освободить память.
tensor_array_name
(необязательно) строка Python: имя TensorArray. Используется при создании дескриптора TensorArray. Если это значение установлено, handle должен быть None.
handle
(необязательно) дескриптор Tensor существующего TensorArray. Если это значение установлено, tensor_array_name должен быть None. Поддерживается только в режиме графа.
flow
(необязательно) скаляр с плавающей запятой 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 bool; если 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().
(N+1)-мерный тензор типа dtype. Тензор для разделения.
lengths
1-мерный вектор int32 с длинами, используемыми при разделении value по первому измерению.
name
Название операции (необязательно).
Возвращаемое значение
Новый объект TensorArray с потоком, гарантирующим выполнение разделения. Используйте этот объект для всех последующих операций.
Исключения
ValueError
если проверка формы завершается ошибкой.
Примечание: Результат этой функции должен быть использован. Если этого не сделать, будет выведено предупреждение или произойдёт ошибка. Чтобы отметить результат как использованный, вызовите метод .mark_used().
Возвращает значения в TensorArray как объединённый Tensor.
Все значения должны быть записаны, и их формы должны совпадать. Если форма входных данных имеет ранг-R, то форма выходных данных будет иметь ранг-(R+1).
Если форма входного значения имеет ранг-R, то выходной TensorArray будет содержать элементы с формой ранга-(R-1).
Аргументы
value
(N+1)-мерный тензор типа dtype. Тензор для разделения.
name
Название операции (необязательно).
Возвращаемое значение
Новый объект TensorArray с потоком, гарантирующим выполнение разделения. Используйте этот объект для всех последующих операций.
Исключения
ValueError
если проверка формы завершается ошибкой.
Примечание: Результат этой функции должен быть использован. Если этого не сделать, будет выведено предупреждение или произойдёт ошибка. Чтобы отметить результат как использованный, вызовите метод .mark_used().
N-мерный тензор типа dtype. Тензор для записи в этот индекс.
name
Название операции (необязательно).
Возвращаемое значение
Новый объект TensorArray с потоком, гарантирующим выполнение записи. Используйте этот объект для всех последующих операций.
Исключения
ValueError
если число записей больше указанного.
Примечание: Результат этой функции должен быть использован. Если этого не сделать, будет выведено предупреждение или произойдёт ошибка. Чтобы отметить результат как использованный, вызовите метод .mark_used().