Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PyTorch中,什么使张量具有非连续内存?_Pytorch - Fatal编程技术网

在PyTorch中,什么使张量具有非连续内存?

在PyTorch中,什么使张量具有非连续内存?,pytorch,Pytorch,根据and,PyTorch的视图函数只在连续内存上工作,而整形则不工作。在第二个链接中,作者甚至声称: [视图]将在非连续张量上引发错误 但是张量什么时候具有非连续内存?是一个很好的答案,它在NumPy的上下文中解释了这个主题。PyTorch的工作原理基本相同。它的文档通常并没有提到函数输出是否(非)连续,但这是可以根据操作的类型来猜测的(有一些经验和对实现的理解)。根据经验,大多数操作在构造新的张量时都保持连续性。如果操作在就地阵列上工作并更改其跨距,则可能会看到非连续输出。下面有几个例子 i

根据and,PyTorch的
视图
函数只在连续内存上工作,而
整形
则不工作。在第二个链接中,作者甚至声称:

[
视图
]将在非连续张量上引发错误

但是张量什么时候具有非连续内存?

是一个很好的答案,它在NumPy的上下文中解释了这个主题。PyTorch的工作原理基本相同。它的文档通常并没有提到函数输出是否(非)连续,但这是可以根据操作的类型来猜测的(有一些经验和对实现的理解)。根据经验,大多数操作在构造新的张量时都保持连续性。如果操作在就地阵列上工作并更改其跨距,则可能会看到非连续输出。下面有几个例子

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.continuous()
使其连续。如果
t
是连续的,那么调用
t.continuous()
基本上是不可操作的,因此您可以这样做,而不必冒性能受到严重影响的风险。

我认为您的标题
连续内存
有点误导。据我所知,PyTorch中的连续表示张量中的相邻元素是否在内存中彼此相邻。让我们举一个简单的例子:

x=torch.tensor([1,2,3],[4,5,6]])#x是连续的
y=火炬。转置(0,1)#y是非连续的
根据:

返回一个张量,该张量是输入的转置版本。将交换给定尺寸dim0和dim1

结果输出张量与输入张量共享其底层存储,因此更改一个张量的内容将更改另一个张量的内容

使上例中的
x
y
共享相同的内存空间。但是如果你用
是连续的()
检查它们的连续性,你会发现
x
是连续的而
y
不是。现在您将发现
连续性
并不是指
连续内存

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