PyTorch:如何通过广播两个不同形状的张量相乘
PyTorch: How to multiply via broadcasting of two tensors with different shapes
我有以下两个 PyTorch 张量 A 和 B。
A = torch.tensor(np.array([40, 42, 38]), dtype = torch.float64)
tensor([40., 42., 38.], dtype=torch.float64)
B = torch.tensor(np.array([[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]], [[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8]], [[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11]]]), dtype = torch.float64)
tensor([[[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.]],
[[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.]],
[[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.]]], dtype=torch.float64)
张量A的形状:
torch.Size([3])
张量 B 的形状:
torch.Size([3, 5, 5])
如何以这种方式将张量 A 与张量 B 相乘(使用广播),例如。张量 A 中的第一个值(即 40.
)乘以张量 B 中第一个 'nested' 张量中的所有值,即
tensor([[[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.]],
对于张量 A 中的其他 2 个值和张量 B 中的其他两个嵌套张量,依此类推。
如果 A 和 B 都是形状为 (3,) 的数组,我可以用 numpy 数组做这个乘法(通过广播)——即。 A*B
- 但我似乎无法用 PyTorch 张量找出它的对应物。非常感谢任何帮助。
在 pytorch(以及 numpy)中应用广播时,您需要从 last 维度开始(查看 https://pytorch.org/docs/stable/notes/broadcasting.html)。如果它们不匹配,则需要重塑张量。在你的情况下,它们不能直接被广播:
[3] # the two values in the last dimensions are not one and do not match
[3, 5, 5]
相反,您可以在乘积之前重新定义 A = A[:, None, None]
以获得形状
[3, 1, 1]
[3, 5, 5]
满足广播条件
我有以下两个 PyTorch 张量 A 和 B。
A = torch.tensor(np.array([40, 42, 38]), dtype = torch.float64)
tensor([40., 42., 38.], dtype=torch.float64)
B = torch.tensor(np.array([[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]], [[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8]], [[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11]]]), dtype = torch.float64)
tensor([[[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.]],
[[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.]],
[[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.],
[ 7., 8., 9., 10., 11.]]], dtype=torch.float64)
张量A的形状:
torch.Size([3])
张量 B 的形状:
torch.Size([3, 5, 5])
如何以这种方式将张量 A 与张量 B 相乘(使用广播),例如。张量 A 中的第一个值(即 40.
)乘以张量 B 中第一个 'nested' 张量中的所有值,即
tensor([[[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.]],
对于张量 A 中的其他 2 个值和张量 B 中的其他两个嵌套张量,依此类推。
如果 A 和 B 都是形状为 (3,) 的数组,我可以用 numpy 数组做这个乘法(通过广播)——即。 A*B
- 但我似乎无法用 PyTorch 张量找出它的对应物。非常感谢任何帮助。
在 pytorch(以及 numpy)中应用广播时,您需要从 last 维度开始(查看 https://pytorch.org/docs/stable/notes/broadcasting.html)。如果它们不匹配,则需要重塑张量。在你的情况下,它们不能直接被广播:
[3] # the two values in the last dimensions are not one and do not match
[3, 5, 5]
相反,您可以在乘积之前重新定义 A = A[:, None, None]
以获得形状
[3, 1, 1]
[3, 5, 5]
满足广播条件