首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.contiguous()在PyTorch中做什么?

.contiguous()在PyTorch中做什么?
EN

Stack Overflow用户
提问于 2018-02-21 21:30:57
回答 7查看 112.8K关注 0票数 182

x.contiguous()对张量x做了什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-09-07 21:13:55

在PyTorch中有几个关于张量的操作不会改变张量的内容,但是会改变数据的组织方式。这些行动包括:

narrow()view()expand()transpose()

例如:当调用transpose()时,PyTorch不会生成新布局的新张量,它只是修改张量对象中的元信息,以便偏移量和步长描述所需的新形状。在本例中,转置张量和原始张量共享相同的内存:

代码语言:javascript
复制
x = torch.randn(3,2)
y = torch.transpose(x, 0, 1)
x[0, 0] = 42
print(y[0,0])
# prints 42

这就是毗连的概念所在。在上面的例子中,x是连续的,但是y并不是因为它的内存布局不同于从零开始形成的相同形状的张量。请注意,“连续”这个词有点误导,因为它并不是张量的内容分散在断开连接的内存块周围。在这里,字节仍然在一个内存块中分配,但是元素的顺序是不同的!

当您调用contiguous()时,它实际上是张量的一个副本,这样它在内存中元素的顺序是相同的,就好像它是用相同的数据从头开始创建的一样。

通常你不需要担心这个。您通常可以安全地假设一切都会正常工作,并等到得到一个RuntimeError: input is not contiguous时,PyTorch需要一个连续的张量来添加对contiguous()的调用。

票数 317
EN

Stack Overflow用户

发布于 2018-02-22 08:22:51

来自pytorch文档

contiguous() → Tensor 返回包含与自张量相同的数据的连续张量。如果自张量是连续的,则此函数返回自张量。

这里的contiguous不仅意味着内存中的连续,而且意味着内存中的顺序与索引顺序相同:例如,做一个换位不会改变内存中的数据,它只是将映射从索引更改为内存指针,如果然后应用contiguous(),它将更改内存中的数据,从而使从索引到内存位置的映射成为规范的映射。

票数 45
EN

Stack Overflow用户

发布于 2021-10-16 21:54:21

如果将一维数组0、1、2、3、4放置在内存中,如下所示:

如果存储它的内存区域如下所示,则不是连续的:

对于二维数组或更多的数组,项也必须相邻,但顺序遵循不同的约定。让我们考虑下面的2D数组:

代码语言:javascript
复制
>>> t = torch.tensor([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])

如果行存储在一起,则内存分配是C连续,如下所示:

这就是毕道尔认为是毗连的。

代码语言:javascript
复制
>>> t.is_contiguous()
True

与数组关联的skip属性提供要跳过的字节数,以获取每个维度中的下一个元素。

代码语言:javascript
复制
>>> t.stride()
(4, 1)

我们需要跳过4个字节才能转到下一行,但只有一个字节才能转到同一行中的下一个元素。

正如在其他答案中所说的,一些Pytorch操作不改变内存分配,只更改元数据。

例如,转置法。让我们转换张量:

内存分配没有改变:

但这一大步:

代码语言:javascript
复制
>>> t.T.stride()
(1, 4)

我们需要跳过1字节到下一行,4字节跳到同一行的下一个元素。张量不再是C连续的(实际上它是Fortran连续的:每一列都存储在彼此的旁边)

代码语言:javascript
复制
>>> t.T.is_contiguous()
False

contiguous()将重新安排内存分配,以便张量是C连续的:

代码语言:javascript
复制
>>> t.T.contiguous().stride()
(3, 1)
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48915810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档