python - pytorch:如何进行分层乘法?

标签 python deep-learning pytorch tensor

我有一个包含五个 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

最佳答案

您可以使用 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])) 用于矩阵乘法,因为 a 的最后一个维度等于 b 的第一维。完成乘法后,我们再次转置它,使用 permute() ,到。通过 permute(0,3,1,2) 获得 torch.Size([1, 5, 2, 2]) 所需的形状。

您可以阅读 permute()docs 。但它可以使用参数将 [1, 5, 2, 2] 的当前形状编号为 0 到 3,并在插入参数时进行排列,这意味着 a.permute(0,2,3,1)它将把第一个维度保留在原来的位置,因为第一个参数是 0,第二个维度将移动到第四个维度,因为索引 1 是第四个参数。第三和第四维度将移动到第二和第三维度,因为2和3索引位于第二和第三位置。例如,请记住,当谈论第四维时,它作为参数的表示是 3(而不是 4)。

编辑 例如,如果您想要按元素乘以形状 [32,5,2,2] 和 [32,5] 的张量,以便每个 2x2 矩阵将乘以相应的值,您可以将维度重新排列为 [2 ,2,32,5]通过permute(2,3,0,1) ,然后乘以 a * b然后通过permute(2,3,0,1)恢复到原来的形状再次。这里的关键是最后一个 n第一个矩阵的尺寸,需要与第一个n对齐第二个矩阵的维度。在我们的例子中n=2 .

希望有帮助。

关于python - pytorch:如何进行分层乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61555342/

相关文章:

python - 如何从 CLI 访问我的自定义 python 脚本以便它们对任何文件执行操作?

python - 是否可以使用python更改ms access表名称

python - 如何确定通过 Python 运行的程序(最好是子进程)是否崩溃或成功结束

python-3.x - 如何在pytorch中放大图像?

python-3.x - 使用大型多个数据集,其中每个数据集包含多个值 - Pytorch

python - 根据同一列表中的下一个项目从列表中删除项目

python - 如何在 Keras 中重用 VGG19 进行图像分类?

tensorflow - 为什么 'dimension' 在机器学习领域有几个不同的含义?

python - Pytorch 获取运行时错误 : Found dtype Double but expected Float

pytorch - 错误 : Some NCCL operations have failed or timed out