This is mostly intended for loops, see for example
- class returnn.frontend.tensor_array.TensorArray(tensor_template: Tensor, *, _backend_tensor_array: Any | None = None, _backend: Type[Backend] | None = None, _enable_delayed_check: bool = False)#
TensorArray. Think of this like a list of tensors. E.g. if each tensor has shape (B, D), and we have N tensors, stacking them together would give us a tensor of shape (N, B, D). Reversely, unstacking a tensor of shape (N, B, D) on the N axis would give us a list of N tensors of shape (B, D).
We use a functional API, and each modifying operation (push_back) returns a new TensorArray object. This is to make sure it works well together with both eager-based and graph-based frameworks.
Internally, the backend functions give us some opaque tensor array object (e.g. TF TensorArray, or maybe just a pure Python list of tensors in case of eager-based frameworks).