目录

张量视图

PyTorch 允许张量是现有张量的 a。视图张量共享相同的底层数据 替换为其基本张量。支持避免了显式数据复制,因此使我们能够快速且节省内存 重塑、切片和元素操作。ViewView

例如,要获取现有张量的视图,您可以调用 .tt.view(...)

>>> t = torch.rand(4, 4)
>>> b = t.view(2, 8)
>>> t.storage().data_ptr() == b.storage().data_ptr()  # `t` and `b` share the same underlying data.
True
# Modifying view tensor changes base tensor as well.
>>> b[0][0] = 3.14
>>> t[0][0]
tensor(3.14)

由于视图与其基本张量共享底层数据,因此如果您编辑数据 在 View 中,它也将反映在 base Tensor 中。

通常,PyTorch 运算会返回一个新的张量作为输出,例如 . 但在 view operations 的情况下,output 是 input tensor 的视图,以避免不必要的数据复制。 创建视图时不会发生数据移动,视图张量只是改变了方式 它解释相同的数据。查看连续张量可能会产生非连续张量。 用户应格外注意,因为连续性可能会对性能产生隐式影响。是一个常见的示例。

>>> base = torch.tensor([[0, 1],[2, 3]])
>>> base.is_contiguous()
True
>>> t = base.transpose(0, 1)  # `t` is a view of `base`. No data movement happened here.
# View tensors might be non-contiguous.
>>> t.is_contiguous()
False
# To get a contiguous tensor, call `.contiguous()` to enforce
# copying data when `t` is not contiguous.
>>> c = t.contiguous()

以下是 PyTorch 中视图操作的完整列表,以供参考:

注意

通过索引访问张量的内容时,PyTorch 遵循 Numpy 行为 该基本索引返回视图,而高级索引返回副本。 通过基本或高级索引进行分配是就地的。请参阅 Numpy 索引文档中的更多示例。

还值得一提的是一些具有特殊行为的 ops:

  • 并且可以返回 view 或 new tensor,则用户代码不应依赖于它是否为 view。

  • 如果 input Tensor 已经是连续的,则返回自身,否则通过复制数据返回新的连续 Tensor。

有关 PyTorch 内部实现的更详细演练, 请参考 ezyang 关于 PyTorch 内部的博文

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源