Torch 中的 view() 和 unsqueeze() 有啥区别?
Posted
技术标签:
【中文标题】Torch 中的 view() 和 unsqueeze() 有啥区别?【英文标题】: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()
?
任何有很好解释的帮助将不胜感激!
【问题讨论】:
discuss.pytorch.org/t/… 【参考方案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 的批次)。
【讨论】:
以上是关于Torch 中的 view() 和 unsqueeze() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Torch 中的 view() 和 unsqueeze() 有啥区别?
Pytorch-view的用法 torch.view(参数a,参数b,...) 有的时候会出现torch.view(-1)或者torch.view(参数a,-1)这种情况。