在看这篇文章之前,首先你需要知道什么是 张量 。
别被这个高逼格的名字唬住,其实张量就是我们常说的 数组 ,在数学、物理领域的称呼,n维的数组就可以称为n阶张量。所以矩阵也可以叫二阶张量,向量则是一阶张量,就连标量也可以用零阶张量来称呼。
知道了张量这个概念后,(你就可以出去小装一下了,开玩笑啦),我们简单聊聊为什么深度学习的文章当中很多都是用张量来称呼数组,这很大程度上受影响于pytorch等框架使用的对象是tensor
,直译过来就叫张量,而numpy模块里的array
直译过来就是数组,二者的操作没有什么区别,tensor的属性和方法也就是继承自ndarray。
当两个张量形状相同时,张量间的 加减运算 实质是张量内的每个元素在进行加减运算,即按元素操作;
同样,当张量与常量进行的 加减乘除 也是张量内的每个元素被进行加减乘除运算,即按元素操作;
在某些情况下,即使两个张量的形状不同,我们仍然可以通过调用 广播机制:broadcasting mechanism 来执行按元素操作。 这种机制的工作方式如下:首先,通过适当复制元素来扩展一个或两个张量, 以便在转换之后,两个张量具有相同的形状。 其次,对生成的张量执行按元素操作。
说明:
- Numpy的数组(也可称作张量)
ndarray
和PyTorch的张量tensor
在使用方法上没有区别,广播机制实质是是从Numpy传入PyTorch框架
在大多数情况下,我们将沿着数组中长度为1的轴进行广播,如下例子:
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
结果:(tensor([[0],
[1],
[2]]),
tensor([[0, 1]]))
由于a和b分别是 3×1 和 1×2 矩阵,如果让它们相加,它们的形状不匹配。 我们将两个矩阵广播为一个更大的 3×2 矩阵,如下所示:矩阵a将复制列变为2, 矩阵b将复制行变为3,然后再按元素相加。
a + b
结果:tensor([[0, 1],
[1, 2],
[2, 3]])
上述的结果,就是由张量:tensor([[0, 0],[1, 1],[2, 2]]) 与张量:tensor([[0, 1],[0, 1],[0, 1]]) 相加而得。
值得注意的是,张量间的乘除运算不会触发广播,因为这两种运算不是元素操作。
广播主要发生在两种情况:
常量与张量的运算也是元素操作,也触发了广播机制。