pytorch。如何进行层乘法?

问题描述 投票:0回答:1

我有一个包含五个2x2矩阵的张量--形状(1,5,2,2),还有一个包含5个元素的张量--形状([5])。我想将每个2x2矩阵(在前一个张量中)与相应的值(在后一个张量中)相乘。结果张量的形状应该是(1,5,2,2)。如何做到这一点?

当我运行这段代码时,得到以下错误

a = torch.rand(1,5,2,2)
print(a.shape)
b = torch.rand(5)
print(b.shape)
mul = a*b

RuntimeError: The size of tensor a (2) must match the size of tensor b (5) at non-singleton dimension 3
python deep-learning pytorch tensor
1个回答
1
投票

你可以使用以下两种方法 a * btorch.mul(a, b) 不过 你必须使用 permute() 前后相乘,才能有相容的形状。

import torch
a = torch.ones(1,5,2,2)
b = torch.rand(5)
a.shape # torch.Size([1, 5, 2, 2])
b.shape # torch.Size([5])

c = (a.permute(0,2,3,1) * b).permute(0,3,1,2)
c.shape # torch.Size([1, 5, 2, 2])

# OR #
c = torch.mul(a.permute(0,2,3,1), b).permute(0,3,1,2)
c.shape # torch.Size([1, 5, 2, 2])

这个... permute() 函数按照参数的顺序进行换位。即 a.permute(0,2,3,1) 将是 torch.Size([1, 2, 2, 5])的形状,它适合于 b (torch.Size([5]))进行矩阵乘法,因为最后一个dimention of the a 等于 b. 在完成乘法后,我们再次将其转置,用 permute()通过permute(0,3,1,2)将torch.Size([1,5,2,2])变成所需形状。

你可以阅读关于 permute()文件. 但它的工作原理是将当前的[1,5,2,2]形状按0到3进行编号,并按你插入的参数进行排列,这意味着对于 a.permute(0,2,3,1) 它将保持第一个参数的位置,因为第一个参数是0,第二个参数将移动到第四个参数的位置,因为索引1是第四个参数。而第三和第四dimention将移动到第二和第三dimention,因为2和3的指数位于第二和第三位。例如,当谈到第4个二段时,它作为论据的表示是3(而不是4)。

编辑例如,如果您想将形状为[32,5,2,2]和[32,5]的时序元素相乘,使每个2x2矩阵将乘以相应的值,您可以通过以下方法将dimentions重新排列为[2,2,32,5]。permute(2,3,0,1),然后执行乘以 a * b 然后通过以下方法恢复到原来的形状 permute(2,3,0,1) 再次。这里的关键是,最后的 n 矩阵,需要与第一个矩阵对齐。n 第二矩阵的描述。在我们的情况下 n=2.

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.