• 文档 >
  • 张量视图
快捷键

张量视图 ¶

PyTorch 允许一个张量成为现有张量的一个视图。视图张量与其基础张量共享相同的基本数据。支持 View 可以避免显式数据复制,从而允许我们进行快速且内存高效的重新塑形、切片和逐元素操作。

例如,要获取现有张量 t 的视图,可以调用 t.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)

由于视图与其基础张量共享底层数据,如果在视图中编辑数据,它也会在基础张量中反映出来。

通常 PyTorch 操作返回一个新的张量作为输出,例如 add() 。但在视图操作的情况下,输出是输入张量的视图,以避免不必要的数据复制。创建视图时不会发生数据移动,视图张量只是改变了它解释相同数据的方式。对连续张量取视图可能会产生非连续张量。用户应特别注意,连续性可能具有隐含的性能影响。 transpose() 是一个常见示例。

>>> 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 索引文档。

值得注意的是,一些操作具有特殊的行为:

  • reshape()reshape_as()flatten() 可以返回一个视图或新的张量,用户代码不应依赖于它是视图还是不是。

  • contiguous() 如果输入张量已经是连续的,则返回自身,否则通过复制数据返回一个新的连续张量。

想要详细了解 PyTorch 内部实现,请参阅 ezyang 的 PyTorch 内部机制博客文章。


© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,主题由 Read the Docs 提供。

文档

PyTorch 开发者文档全面访问

查看文档

教程

获取初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得您的疑问解答

查看资源