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