import torch
a=torch.tensor([[[1,2]],[[3,4]]])
print(a.shape)
b=torch.tensor([[[7],[8]],[[9],[10]]])
print(b.shape)
c=a-b
print©
print(c.shape) 请用广播机制解释此代码
在这段代码中,a 和 b 的原始形状分别是 (2, 1, 2) 和 (2, 2, 1)。因为他们形状不同,所以在计算 c=a-b 时,对 a 和 b 进行广播以进行元素级别的减法运算。
广播机制工作流程如下:
广播规则首先会匹配两个张量的维度数。如果张量的维度数不同,较小维度的张量会在左边补1,直到两个张量的维度数相等。然而在这段代码中,a 和 b 的维度数都是3,所以无需进行此步骤。
接下来,PyTorch会逐个比较这两个张量的每个维度。三个不同维度的情况如下:
对于第一维度(2,2),a 和 b 在该维度上尺寸相同,不需要广播。
对于第二维度(1,2)a 的尺寸为1,b 的尺寸为2。由于 a 在该维度上的尺寸为1,根据广播规则,a 在第二维度上扩展,以匹配 b 的尺寸2。
对于第三维度(2,1),a 的尺寸为2,b 的尺寸为1。由于 b 在该维度上的尺寸为1,根据广播规则,b 在第三维度上扩展,以匹配 a 的尺寸2。
根据广播规则,a 和 b 在执行减法操作之前,先被扩展为相同的形状 (2, 2, 2)。所以,张量 c 的形状也是 (2, 2, 2)。
这就是你的代码的广播机制的解释。
那拓展为形状 (2, 2, 2)的a和b什么样子
在你给出的代码中,张量 a 和 b 通过广播变为 (2,2,2) 形状后如下:
张量 a 的原始形状是 (2,1,2):
python
复制代码
a = torch.tensor([[[1,2]],[[3,4]]])
经过广播后,张量 a 变为:
python
复制代码
a_broadcasted = tensor([[[1, 2],
[1, 2]],
[[3, 4],
[3, 4]]])
张量 b 的原始形状是 (2,2,1):
python
复制代码
b = torch.tensor([[[7],[8]],[[9],[10]]])
经过广播后,张量 b 变为:
python
复制代码
b_broadcasted = tensor([[[ 7, 7],
[ 8, 8]],
[[ 9, 9],
[10, 10]]])
注意:在实践中,广播并不会显式地创建这些扩展的副本,因为那样可能会占用大量内存。广播只是在计算过程中有效地使用这些“复制”的值,而不会实际在内存中复制。以上的 a_broadcasted 和 b_broadcasted 只是为了解释广播机制而显示的。