Broadcasting可以自动进行维度的扩展,而且不需要拷贝数据。
例如:
import torch
a = torch.rand(3,4)
# tensor([[0.0422, 0.9152, 0.5486, 0.8753],
# [0.3918, 0.6056, 0.0634, 0.9498],
# [0.4444, 0.2209, 0.8165, 0.1533]])
b = torch.rand(4)
# tensor([0.4145, 0.2913, 0.1655, 0.3705])
a + b
# tensor([[0.4567, 1.2065, 0.7141, 1.2458],
# [0.8064, 0.8969, 0.2289, 1.3203],
# [0.8589, 0.5122, 0.9819, 0.5238]])
上面的例子可以看到,虽然a和b的shape不同,但是依然可以进行相加操作,原因就是PyTorch自动做了Broadcasting。但不是任何两个tensor都可以进行Broadcasting。
如果两个Tensor是broadcastable的,那么就可以对他俩使用支持broadcast的运算,比如直接加减乘除
而两个向量要是broadcast的话,必须满足以下两个条件:
- 每个tensor至少是一维的
- 两个tensor的维数从后往前,对应的位置要么是相等的,要么其中一个是1,或者不存在
>>> x=torch.empty(5,7,3)
>>> y=torch.empty(5,7,3)
# 相同维数的tensor一定是broadcastable的
>>> x=torch.empty((0,))
>>> y=torch.empty(2,2)
# 不是broadcastable的,因为每个tensor维数至少要是1
>>> x=torch.empty(5,3,4,1)
>>> y=torch.empty( 3,1,1)
# 是broadcastable的,因为从后往前看,一定要注意是从后往前看!
# 第一个维度都是1,相等,满足第二个条件
# 第二个维度其中有一个是1,满足第二个条件
# 第三个维度都是3,相等,满足第二个条件
# 第四个维度其中有一个不存在,满足第二个条件
# 但是
>>> x=torch.empty(5,2,4,1)
>>> y=torch.empty( 3,1,1)
# 不是broadcastable的,因为从后往前看第三个维度是不match的 2!=3,且都不是1