Skip to content

tensor视图

译者:片刻小哥哥

项目地址:https://pytorch.apachecn.org/2.0/docs/tensor_view

原始地址:https://pytorch.org/docs/stable/tensor_view.html

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

例如,要获取现有tensor“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)

由于视图与其基本tensor共享基础数据,因此如果您在视图中编辑数据,它也会反映在基本tensor中。

通常,PyTorch 操作会返回一个新的tensor作为输出,例如add() 。但是在视图操作的情况下,输出是输入tensor的视图,以避免不必要的数据复制创建视图时不会发生数据移动,视图tensor只是改变它解释相同数据的方式。查看连续tensor可能会产生非连续tensor。用户应额外注意,因为连续性可能会对性能产生隐式影响。 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 中视图操作的完整列表:

笔记

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

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

  • reshape() , reshape_as()flatten() 可以返回无论是视图还是新tensor,用户代码都不应该依赖于它是否是视图。
  • contigously() 如果输入tensor已经是连续的,则返回本身,否则它通过复制数据返回一个新的连续tensor。

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


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组