在pytorch的张量计算中,“广播”指的是当满足一定条件时,较小的张量能够自动扩张成合适尺寸的大张量,使得能够进行计算。
References:
电子文献:
https://pytorch.org/docs/stable/notes/broadcasting.html
条件
当一对张量满足下面的条件时,它们才是可以被“广播”的。
- 每个张量至少有一个维度。
- 迭代维度尺寸时,从尾部(也就是从后往前)开始,依次每个维度的尺寸必须满足以下之一:
- 相等。
- 其中一个张量的维度尺寸为1。
- 其中一个张量不存在这个维度。
例子
光看条件可能会有点迷,下面是官方文档中的几个例子。
1 | import torch |
首先,显然相同形状的张量是可以广播的(或者说不需要广播)。
1 | x = torch.empty(5, 7, 3) |
(x+y).size()
输出torch.Size([5, 7, 3])
。
一般而言,我们可以从后往前分析一对张量是不是“broadcastable”。
1 | x = torch.empty(5, 3, 4, 1) |
我们依次分析:
对倒数第一个维度,两者尺寸相同,符合“相等”的条件。
对倒数第二个维度,y的尺寸为1,符合“其中一个张量尺寸为1”的条件。
对倒数第三个维度,两者尺寸相同,符合“相等”的条件。
对倒数第四个维度,y的该维度不存在,符合“其中一个张量不存在这个维度”的条件。
综上,这两个张量可以广播。
其实,x可以比y多出更多的维度,都满足该维度有“其中一个张量不存在这个维度”的条件。
举个反例:
1 | x = torch.empty(5, 2, 4, 1) |
这里若x+y就无法广播了,因为从后往前遇到倒数第三个维度时会被卡住,不满足任何一个条件。
此外,对torch.empty((0,))
,它也无法和其他任何张量广播,可以输出发现其结果为tensor([])
,是空的,这就不满足“每个张量至少有一个维度”这个条件。
tensor.view()
这里做个补充,一般我们在全连接层,总是会看到对某个张量作view(-1, ...)
的变换,其实这里的“-1”并不是直接表示尺寸,而是起到让计算机帮助自动计算的功能。
举个例子,比如一个tensor含有6个数据(无论唯独尺寸如何组合),我们对其view(-1, 2)
,那么输出的尺寸就是[3, 2],若view(-1)
,那么输出的尺寸就是[6]。
注意,不能同时出现两个“-1”让机器计算。虽然在某些情况下,人能够判断,比如含有6个数据的tensor我们能够想到view(-1, -1, 6)
输出尺寸是[1, 1, 6],但机器就会认为这是个错误。