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

时间:2017-03-17 20:34:50

标签: 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()在作为参数给出的位置插入单身昏暗,view()创建一个与tensor相关联的存储维度不同的视图。

view()对我来说很清楚,但我无法将其与unsqueeze()区分开来。此外,我不知道何时使用view()以及何时使用unsqueeze()

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

2 个答案:

答案 0 :(得分:16)

view()只能取一个“-1”参数。

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

但是,有时,在使用操作时,输入的维度是未知的。因此,我们不知道A是2x3x4,但我们仍然希望插入单个维度。当使用张量的张量时,这种情况会发生很多,其中最后一个维度通常是未知的。在这些情况下,nn.Unsqueeze非常有用,我们可以在编写代码时插入维度而无需显式地了解其他维度。

答案 1 :(得分:0)

unsqueeze()view()

特例

为方便起见,许多 Python 库都有简写别名,用于更通用的函数的常见用途。

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

何时使用 unsqueeze()

一些示例用例:

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