直观理解Tensor的dim
你是否曾经对张量维度的工作原理感到困惑,尤其是当你需要在高维度上应用 sum()
等操作时? 你在这篇文章中学到的技术不仅适用于张量维度,也适用于 Numpy ndarray 维度,因为多维数组/张量的逻辑是相同的。
本文将以一种直观的方式来可视化 sum()
运算在张量维度上的工作原理,并使用 Pytorch 检查代码中张量和的示例。
1、张量的形状(维度)
首先,张量只是多维数组的另一个名称。 当数学家定义了术语:标量(0D)、向量(1D)、矩阵(2D)时,我们需要一个高维的通用术语和概念。
这是一个张量,我们可以通过计算每一层括号的数量来找到张量的形状。 请注意,最外面的括号将被忽略,因为它只是用来包裹整个对象。
所以这里我们在最外层有 2 个元素 (dim: 0),在第二层有 3 个元素 (dim: 1),在最内层有 3 个元素 (dim: 2)。 因此,张量的形状为(2,3,3)。
2、Dim 0 求和
接下来,我们将对维度 0 求和,我们只需要遵循 3 个简单的步骤:
- 识别维度中的元素。
- 重叠这些元素。
- 用X光眼将出现在同一位置的数字相加。
就是这样! 分步说明如下:
注意:当你对张量中的dim i 求和时,会将dim i 减少到 1,因为将该维度中的每个数字相加,并将多个数字减少为一个总和。 你会看到这种情况发生在各个维度。
现在,我们已经了解了它在维度 0 上的工作原理,让我们在维度 1 上挑战相同的步骤。
3、Dim 1 求和
注意:在对dim 1 求和之后,dim 1 上也会发生相同的维度缩减,并且求和后的新形状已缩减为 (2,1,3)。
我们只需要将相同的步骤进行到最后一个维度即可。
4、Dim 2 求和
注意:在我们对 dim 2 求和之后,同样的降维也发生在 dim 2 上,并且求和后的新形状已减少到 (2,3,1)。
现在我们已经了解了张量 sum()
运算的工作原理,让我们用代码来实现。
5、使用Pytorch执行张量求和
下面的 Jupyter Notebook 展示了我们如何执行张量 sum()
并检查我们对其维度的理解。
import torch
x = torch.FloatTensor([
[2.,1.],
[2.,1.],
[2.,1.]
])
torch.sum(x, dim=0, keepdim=True)
x = torch.FloatTensor([
[2.,1.],
[2.,1.],
[2.,1.]
])
torch.sum(x, dim=1, keepdim=True)
x = torch.FloatTensor([
[2.,1.],
[2.,1.],
[2.,1.]
])
torch.sum(x, dim=-1, keepdim=True)
x = torch.FloatTensor([[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],
])
torch.sum(x, dim=0, keepdim=True)
x = torch.FloatTensor([[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],
])
torch.sum(x, dim=1, keepdim=True)
x = torch.FloatTensor([[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],
])
torch.sum(x, dim=2, keepdim=True)
x = torch.FloatTensor([[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],[
[1.,2.,3.],
[1.,2.,3.],
[1.,2.,3.]
],
])
torch.sum(x, dim=-1, keepdim=True)
注意:在函数中,你需要指定 keepdim=True 以保留其原始尺寸,如我们在第一个直观部分中展示的那样。 否则,减少到 1 的维度将被简单地删除。
7、结束语
这是我在努力理解高维张量上的运算符(例如 sigmoid、max、sum 等)时自学的最直观的可视化,我希望本文能够增强你的张量直觉,让你快速识别张量维度!
原文链接:An Intuitive Understanding on Tensor Dimension with Pytorch — Using torch.sum() as Example
BimAnt翻译整理,转载请标明出处