Torch 中的 view() 和 unsqueeze() 有什么区别?

What is the difference between view() and unsqueeze() in Torch?

使用unsqueeze()

input = torch.Tensor(2, 4, 3) # input: 2 x 4 x 3
print(input.unsqueeze(0).size()) # prints - torch.size([1, 2, 4, 3])

使用view()

input = torch.Tensor(2, 4, 3) # input: 2 x 4 x 3
print(input.view(1, -1, -1, -1).size()) # prints - torch.size([1, 2, 4, 3])

根据文档,unsqueeze() 在作为参数给定的位置插入单例 dim,并且 view() 创建一个视图,该视图具有与 tensor 关联的不同存储维度。

view()的作用我很清楚,但我无法将它与unsqueeze()区分开来。而且,我不明白什么时候用view(),什么时候用unsqueeze()?

任何有好的解释的帮助将不胜感激!

view() 只能接受一个 -1 参数。

因此,如果您想添加单例维度,则需要提供所有维度作为参数。例如,如果 A 是一个 2x3x4 张量,要添加单例维度,您需要执行 A:view(2, 1, 3, 4).

但是,有时在使用操作时输入的维度是未知的。因此,我们不知道 A 是 2x3x4,但我们仍然想插入一个单例维度。当使用张量的小批量时,这种情况经常发生,其中最后一个维度通常是未知的。在这些情况下,nn.Unsqueeze 很有用,它让我们在编写代码时无需明确知道其他维度即可插入维度。

unsqueeze()view()

特例

为方便起见,许多 python 库都有常用函数的简写别名。

  • view() 将张量重塑为指定的形状
  • unsqueeze() 通过添加深度为 1
    的新维度来重塑张量 (即将 n.d 张量转换为 n+1.d 张量)

何时使用 unsqueeze()

一些示例用例:

  • 您有一个设计用于接收 RGB 图像张量 (3d: CxHxW) 的模型,但您的数据是二维灰度图像 (​​HxW)
  • 您的模型旨在接收成批数据 (batch_size x dim1 x dim2 x ...),而您希望为其提供单个样本(即大小为 1 的批次)。