reshape() 和 view method() 的区别

问题描述 投票:0回答:1

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)

有什么区别以及我应该使用哪个

arrays dataset torch
1个回答
0
投票

主要区别在于

torch.Tensor.reshape()
torch.Tensor.view()
如何处理非连续张量。

要理解差异,我们需要了解什么是连续张量,以及什么是张量的视图:

  • A 连续张量 是一个张量,其值存储在单个、不间断的(因此是“连续的”)内存中。非连续张量的内存布局可能有间隙。
  • 生成张量的视图意味着重新解释其内存中值的排列。想象一下存储 16 个值的内存:我们可以将其解释为 16 元素一维张量或 4×4 元素二维张量。两种解释都可以使用相同的底层内存。通过使用视图并重新解释内存布局,我们可以从同一块内存创建不同形状的张量,这样可以避免重复并节省内存。

现在回到这两种方法:

  • 如果应用于连续张量,
    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 论坛的此讨论中。

© www.soinside.com 2019 - 2024. All rights reserved.