reshape 和 view 方法有什么区别,为什么我们需要,我正在使用 pytorch 张量并致力于改变数据的形状,然后我开始了解这两个函数。如果我们使用较少的资源处理大数据,那么对内存的影响是什么?哪些消耗更多的内存,哪些成本更高。
x = torch.tensor([1, 2, 3, 4, 5], dtype = torch.float32)
x = x.reshape(-1, 1)
以及查看方法
x = x.view(x.shape[0], 1)
有什么区别以及我应该使用哪个
torch.Tensor.reshape()
和 torch.Tensor.view()
如何处理非连续张量。
要理解差异,我们需要了解什么是连续张量,以及什么是张量的视图:
现在回到这两种方法:
reshape()
和view()
都会生成给定张量内存的新视图,这样就避免了重复。reshape()
方法将复制必要的内存并返回一个张量,其内存不会与给定的张量共享。view()
方法将产生一个RuntimeError
。我们可以用下面的代码来演示这一点:
import torch
contiguous = torch.arange(16).reshape(4, 4) # Create a contiguous tensor
noncontiguous = contiguous[:2, :2] # Create a non-contiguous tensor
contiguous_r = contiguous.reshape((16,)) # OK: produces a 1-d view
contiguous_v = contiguous.view((16,)) # OK: produces a 1-d view
noncontiguous_r = noncontiguous.reshape((4,)) # OK: produces a new 1-d array
noncontiguous_v = noncontiguous.view((4,)) # ERROR: cannot produce view
最后一行将产生 RuntimeError:视图大小与输入张量的大小和步幅不兼容(至少一个维度跨越两个连续的子空间)。使用 .reshape(...) 代替。
也许在这一点上,我还应该提到张量的 stride 是什么:本质上,它是告诉我们如何将张量的索引映射到其底层内存的信息。您将找到有关步幅的更多信息,以及有关连续张量与非连续张量的一般信息,例如,在 PyTorch 论坛的此讨论中。