Pytorch 中张量的理解
张量是一棵树
长久以来,张量和其中维度的概念把我搞的晕头转向。
一维的张量是数组,二维的张量是矩阵,这也很有道理。
但是给一个二维张量,让我算出它每一行的和,应该用 sum(dim=0) 还是 sum(dim=1)? 这个问题还得让我想个一会儿。
更别说四维的张量是什么,一百维的张量又是什么,这种问题了,我不知道,想想就头大。
但是直到把张量看成一棵树,许多问题就迎刃而解~
如下图所示,分别表示三种不同形状的张量:
基本规律是:
- 不算最上边的树根节点,剩下的节点有几层,那这个张量就是几维的。(换种说法:张量的维数=树高-1)
- 维度dim=0对应树中的第二层,维度dim=1对应树中的第三层,以此类推。
- 每一层的维度 = 这一层的每个节点有几个亲兄弟节点。
带有维度的运算
张量以某个维度进行运算,就是:
- 把对应树中这个维度的亲兄弟节点都移动至重叠状态
- 上述移动会导致部分叶子节点重叠,把重叠的叶子节点进行相应运算
- 删除该维度
以 shape 为 [1, 2, 2] 的张量t 举例说明:
t.sum(dim=1)
最终张量的shape是 [1, 2]
t.sum(dim=0)
第0维的节点只有一个,所以不用进行兄弟节点之间的合并,自然也不会有重叠的叶子节点,所以就不用运算,只需要删除第0维即可。
最终张量的shape是 [2, 2]
t.sum(dim=2)
删掉的恰好是最后一层叶子节点,数据上移到新的叶子节点中。
最终张量的shape是 [1, 2]
增加删除维度
给张量增加一个维度等价于给树增加一层。
给张量删除一个维度等价于给树删除一层。
但是,增删的维度是有限制的:维度必须为1。
删除一个维度为1的层
增加一个维度为1的层
示例1
示例2
总结
将张量看成一个树形结构能在某种程度更加直观的理解张量的概念及其相关运算。