1. 用其他形状(例如三维张量)替换广播机制中按元素操作的两个张量。结果是否与预期相同?
三维张量的广播机制是一种在形状不同的张量上应用算术运算的机制。广播允许较小的张量“扩展”到较大的张量,使它们的形状相互兼容。这样,我们可以在不复制数据的情况下进行向量化的数组操作,从而提高效率。
以下是关于三维张量广播的一些规则和示例:
-
可广播的一对张量需满足以下规则:
- 每个张量至少有一个维度。
- 迭代维度尺寸时,从尾部的维度开始:
- 维度尺寸相等,或者
- 其中一个张量的维度尺寸为1,或者
- 其中一个张量不存在这个维度。
-
示例:
# 相同形状的张量总是可广播的,因为总能满足以上规则
x = torch.full((1, 2, 3), 1)
y = torch.full((1, 2, 3), 2)
display(x + y)
# 不可广播(a 不满足第一条规则)
a = torch.full((0,), 1)
b = torch.full((2, 2), 2)
# display(a + b)
# 可广播(m 和 n 可广播)
m = torch.full((2, 3, 2, 1), 1)
n = torch.full((3, 1, 1), 2)
l = m + n
display(l.shape, l)
tensor([[[3, 3, 3],
[3, 3, 3]]])
torch.Size([2, 3, 2, 1])
tensor([[[[3],
[3]],
[[3],
[3]],
[[3],
[3]]],
[[[3],
[3]],
[[3],
[3]],
[[3],
[3]]]])
- 广播后的张量尺寸计算:
- 如果 x 和 y 是可广播的,广播后的张量尺寸按照如下方法计算:
- 如果 x 和 y 的维数不等,在维数较少的张量上添加尺寸为1的维度。
- 结果维度尺寸是 x 和 y 相应维度尺寸的较大者。
- 如果 x 和 y 是可广播的,广播后的张量尺寸按照如下方法计算:
- 示例:
# 可广播
o = torch.full((2, 1, 3, 1), 1)
p = torch.full((2, 1, 1), 2)
q = o + p
display(q.shape)
# 不可广播,因为倒数第三个维度:2 != 3
u = torch.full((2, 2, 3, 1), 1)
v = torch.full((3, 1, 1), 2)
# w = u + v
torch.Size([2, 2, 3, 1])