本文主要是介绍3、TENSOR VIEWS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 中视图操作的完整列表:
基本切片和索引操作,例如 tensor[0, 2:, 1:7:2] 返回基本张量的视图,请参见下面的注释。
-
as_strided()
-
detach()
-
diagonal()
-
expand()
-
expand_as()
-
movedim()
-
narrow()
-
permute()
-
select()
-
squeeze()
-
transpose()
-
t()
-
T
-
real
-
imag
-
view_as_real()
-
view_as_imag()
-
unflatten()
-
unfold()
-
unsqueeze()
-
view()
-
view_as()
-
unbind()
-
split()
-
split_with_sizes()
-
swapaxes()
-
swapdims()
-
chunk()
-
indices()
(sparse tensor only) -
values()
(sparse tensor only)
当通过索引访问张量的内容时,PyTorch 遵循 Numpy 行为,即基本索引返回视图,而高级索引返回副本。 通过基本或高级索引进行分配是就地的。 在 Numpy 索引文档中查看更多示例。
还值得一提的是一些具有特殊行为的操作:
1、reshape()、reshape_as() 和 flatten() 可以返回视图或新张量,用户代码不应依赖于它是否为视图。
2、如果输入张量已经是连续的,则 contiguous() 返回自身,否则它通过复制数据返回一个新的连续张量。
有关 PyTorch 内部实现的更详细演练,请参阅 ezyang 关于 PyTorch 内部实现的博文。
这篇关于3、TENSOR VIEWS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!