Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()

Posted 西土城山羊卷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()相关的知识,希望对你有一定的参考价值。

我们认为数组、矩阵、张量都是有形状的,假如有一个形状是 (2×2×3) 的张量 a,从左到右称为第0维、第1维、第2维…我可以使用 a[1] 取出第0维视角下的第1组数据,可以使用 a[:,:,0] 看到第2维视角下的第0组数据。

并且我可以使用 .unsqueeze 方法在 | 0 | 1 | 2| 这三个维度给出的4个任意空隙插入新的维度,如 b = a.unsqueeze(2)b.size() = torch.size([2,2,1,3]) 。可以比较清晰的理解再最高的维度阔维的操作,这就是一些语言中 (如:Python MATLAB) 的广播机制对应的原理。但是在其他部位扩张维度是一件不好理解的事:

In [2]: import torch
In [3]: a = torch.tensor([[1, 2, 3], [4, 5, 6]])
In [4]: a
Out[4]: 
tensor([[1, 2, 3],
        [4, 5, 6]])
In [5]: a.size()
Out[5]: torch.Size([2, 3])
In [6]: b = a.unsqueeze(1)
In [7]: b
Out[7]: 
tensor([[[1, 2, 3]],

        [[4, 5, 6]]])
In [8]: b.size()
Out[8]: torch.Size([2, 1, 3])

对于一个 (2×3) 的张量,从第0维的一维视角看有两组数据 [1, 2, 3] [4, 5, 6],从二维视角看就是一组平面数据,这个平面内实际上是有两个箱子的,一个箱子里放了 [1, 2, 3],另一个箱子里放了 [4, 5, 6],现在我给他在第一维视角上的箱子外又套了一层箱子。这就是阔维的思想。为了形象的理解张量形状的问题,用这种套箱思想,比线、平面、空间思想更加合理。这也与 Python 输出中的一层层方括号更加的契合。

In [9]: c = a.unsqueeze(2)
In [10]: c
Out[10]: 
tensor([[[1],
         [2],
         [3]],
        [[4],
         [5],
         [6]]])
In [11]: c.size()
Out[11]: torch.Size([2, 3, 1])

根据这种思想可以很好的理解上面的这种阔维做了什么。

以上是关于Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()的主要内容,如果未能解决你的问题,请参考以下文章

pytorch的Tensor的操作

PyTorch:tensor-张量维度操作(拼接维度扩展压缩转置重复……)

极智AI | pytorch改变tensor维度的方法

极智AI | pytorch改变tensor维度的方法

详解pytorch之tensor的拼接

PyTorch中Tensor的维度变换实现