首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PyTorch中,是什么使张量具有非连续的记忆?

在PyTorch中,是什么使张量具有非连续的记忆?
EN

Stack Overflow用户
提问于 2019-01-08 15:54:32
回答 2查看 3K关注 0票数 4

根据这是如此这个PyTorch的讨论的说法,PyTorch的view函数只在连续内存上工作,而reshape不工作。在第二个环节中,提交人甚至声称:

view将在非连续张量上引起误差.

但是张量什么时候有不连续的记忆呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-08 17:36:51

是一个非常好的答案,它在NumPy的上下文中解释了这个主题。PyTorch的工作本质上是一样的。它的文档通常没有提到函数输出是否是(非)连续的,但是可以根据操作的类型(对实现有一定的经验和理解)来猜测。作为经验法则,大多数操作在构造新的张量时保持连续。如果操作在数组内部工作并更改其步幅,您可能会看到非连续的输出。下面的几个例子

代码语言:javascript
复制
import torch

t = torch.randn(10, 10)

def check(ten):
    print(ten.is_contiguous())

check(t) # True

# flip sets the stride to negative, but element j is still adjacent to
# element i, so it is contiguous
check(torch.flip(t, (0,))) # True

# if we take every 2nd element, adjacent elements in the resulting array
# are not adjacent in the input array
check(t[::2]) # False

# if we transpose, we lose contiguity, as in case of NumPy
check(t.transpose(0, 1)) # False

# if we transpose twice, we first lose and then regain contiguity
check(t.transpose(0, 1).transpose(0, 1)) # True

通常,如果您有非连续张量t,则可以通过调用t = t.contiguous()使其连续。如果t是连续的,那么对t.contiguous()的调用本质上是不操作的,所以您可以在不冒大性能损失的情况下这样做。

票数 4
EN

Stack Overflow用户

发布于 2019-07-10 03:35:25

我认为你的标题contiguous memory有点误导。据我所知,contiguous在PyTorch中的意思是,张量中的相邻元素实际上是记忆中的相邻元素。让我们举一个简单的例子:

代码语言:javascript
复制
x = torch.tensor([[1, 2, 3], [4, 5, 6]]) # x is contiguous
y = torch.transpose(0, 1) # y is non-contiguous

根据tranpose()

返回一个张量,该张量是输入的转置版本。交换给定的维数dim0和dim1。 结果张量与输入张量共享它的底层存储,因此更改其中一个的内容将改变另一个的内容。

这样,xy在上面的示例中共享相同的内存空间。但是,如果您检查它们与is_contiguous()的相邻性,您会发现x是连续的,而y则不是。现在,您会发现contiguity没有引用contiguous memory

由于x是连续的,所以x[0][0]x[0][1]在内存中是相邻的。但y[0][0]y[0][1]不是。这就是contiguous的意思。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54095351

复制
相关文章

相似问题

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