【问题标题】:What is the difference between view() and unsqueeze() in Torch?Torch 中的 view() 和 unsqueeze() 有什么区别?
【发布时间】:2017-08-09 13:12:23
【问题描述】:

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()

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

【问题讨论】:

标签: python pytorch torch


【解决方案1】:

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

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

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

【讨论】:

  • 在使用 unsqueeze() 和 view() 插入单件维度时,在性能方面有什么不同吗?
  • 为什么不干脆做A.view(A.shape[0], 1, A.shape[1], A.shape[2])
  • @Ritwik 因为那很麻烦。 unsqueeze 专门设计为该操作的简写。
【解决方案2】:

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 的批次)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2010-12-28
    • 2018-09-13
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多