这部分对矩阵运算有着特殊的影响,包括numpy等。
当两个维度相同的数组相加时,实际就时对应元素相加,很容易想象。
如下:
但是如果维度不同的!!!接下来进行讨论:定义放上来很难懂,我就直接结合图进行理解
问题描述:假设我们有两个矩阵维度分维度不同。正常情况下,两个矩阵直接相加应该是元素对应相加,但是例子中维度不同元素难以对应,就会出现问题。
此时,广播机制的作用就体现了出来,他会将其中维度较小的进行x或y方向的复制,然后相加。
图1:y方向的复制
图2:x方向的复制
通过上面看,两个矩阵还是有一定规律的,假设,维度较大的为(w, h),那么较小的为(1, h)或(w, 1)即较小维度的矩阵满足其其中一个维度为1,其余维度与较大维度矩阵的维度一致。这也是广播机制应用的条件。其余不满足此条件的无法使用广播机制。
假设我们有下面一段代码:
import torch l1 = torch.as_tensor([[1, 2], [3, 4], [5, 6]]) l2 = torch.as_tensor([[7, 8]]) print(l1.shape) print(l2.shape) print(l1 + l2)
因为l1维度为(3, 2),l2维度为(1, 2)。l2为维度较小的矩阵,其中第一维度为1,第二维度与l1相同,满足广播机制触发条件,因此可以相加。结果如下:
torch.Size([3, 2]) torch.Size([1, 2]) tensor([[ 8, 10], [10, 12], [12, 14]])
就是类似上面图2的过程
这是二维上面的,如果是三维的可以吗?一段代码进行尝试:
l1 = torch.as_tensor([[[1, 2], [3, 4], [5, 6]]]) l2 = torch.as_tensor([[[7, 8]], [[9, 10]]]) print(l1.shape) print(l2.shape) print(l1 + l2) print((l1 + l2).shape)
l1维度是(1, 3, 2),l2维度是(2, 1, 2)。运行以下代码,是可以通过的!!!
torch.Size([1, 3, 2]) torch.Size([2, 1, 2]) tensor([[[ 8, 10], [10, 12], [12, 14]], [[10, 12], [12, 14], [14, 16]]]) torch.Size([2, 3, 2])
**从上面看,我们三维度的广播机制有些不太符合我们上面总结的广播机制应用条件,但是可以将三维拆开进行理解。**如上面可以拆分为两组二维,分别是l1_1(1,2),l2_1(2, 2)和l1_2(3, 2),l2_2(1, 2),后面与二维操作一致。