根据这是如此和这个PyTorch的讨论的说法,PyTorch的view函数只在连续内存上工作,而reshape不工作。在第二个环节中,提交人甚至声称:
view将在非连续张量上引起误差.
但是张量什么时候有不连续的记忆呢?
发布于 2019-01-08 17:36:51
这是一个非常好的答案,它在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.contiguous()使其连续。如果t是连续的,那么对t.contiguous()的调用本质上是不操作的,所以您可以在不冒大性能损失的情况下这样做。
发布于 2019-07-10 03:35:25
我认为你的标题contiguous memory有点误导。据我所知,contiguous在PyTorch中的意思是,张量中的相邻元素实际上是记忆中的相邻元素。让我们举一个简单的例子:
x = torch.tensor([[1, 2, 3], [4, 5, 6]]) # x is contiguous
y = torch.transpose(0, 1) # y is non-contiguous返回一个张量,该张量是输入的转置版本。交换给定的维数dim0和dim1。 结果张量与输入张量共享它的底层存储,因此更改其中一个的内容将改变另一个的内容。
这样,x和y在上面的示例中共享相同的内存空间。但是,如果您检查它们与is_contiguous()的相邻性,您会发现x是连续的,而y则不是。现在,您会发现contiguity没有引用contiguous memory。
由于x是连续的,所以x[0][0]和x[0][1]在内存中是相邻的。但y[0][0]和y[0][1]不是。这就是contiguous的意思。
https://stackoverflow.com/questions/54095351
复制相似问题