Python 如何在PyTorch中生成具有不同向量的新张量?

Python 如何在PyTorch中生成具有不同向量的新张量?,python,pytorch,Python,Pytorch,我想生成一个新的○带有a和b(○ 表示按元素计算的乘法)。下面是我的代码,但是性能看起来很差,因为的。有什么有效的方法吗 a = torch.rand(batch_size, a_len, hid_dim) b = torch.rand(batch_size, b_len, hid_dim) # a_elmwise_mul_b = torch.zeros(batch_size, a_len, b_len, hid_dim) for sample in range(batch_size):

我想生成一个新的○带有
a
b
(○ 表示按元素计算的乘法)。下面是我的代码,但是性能看起来很差,因为的
。有什么有效的方法吗

a = torch.rand(batch_size, a_len, hid_dim)
b = torch.rand(batch_size, b_len, hid_dim)
# a_elmwise_mul_b = torch.zeros(batch_size, a_len, b_len, hid_dim)
for sample in range(batch_size):
    for ai in range(a_len):
        for bi in range(b_len):
            a_elmwise_mul_b[sample, ai, bi] = torch.mul(a[sample, ai], b[sample, bi])
更新 我更新了我的代码,请参考艾哈迈德!多谢各位

N = 16
hid_dim = 50
a_seq_len = 10
b_seq_len = 20
a = torch.randn(N, a_seq_len, hid_dim)
b = torch.randn(N, b_seq_len, hid_dim)
shape = (N, a_seq_len, b_seq_len, hid_dim)

a_dash = a.unsqueeze(2) # (N, a_len, 1,     hid_dim)
b_dash = b.unsqueeze(1) # (N, 1,     b_len, hid_dim)
a_dash = a_dash.expand(shape)
b_dash = b_dash.expand(shape)
print(a_dash.size(), b_dash.size())
mul = a_dash * b_dash
print(mul.size())
----------
torch.Size([16, 10, 20, 50]) torch.Size([16, 10, 20, 50])
torch.Size([16, 10, 20, 50])

从你的问题定义来看,看起来你想乘以两个张量,比如形状
AxE
BxE
A
B
,然后得到形状
AxBxE
的张量。这意味着您要将每一行张量
A
与整个张量
B
相乘。如果它是正确的,那么我们就不称之为元素乘法

你可以按如下方式实现你的目标

import torch

# batch_size = 16, a_len = 10, b_len = 20, hid_dim = 50
a = torch.rand(16, 10, 50)
b = torch.rand(16, 20, 50)

c = a.unsqueeze(2).expand(*a.size()[:-1], b.size(1), a.size()[-1])
d = b.unsqueeze(1).expand(b.size()[0], a.size(1), *b.size()[1:])
print(c.size(), d.size())
print(c.size(), d.size())

mul = c * d       # shape of c, d: 16 x 10 x 20 x 50
print(mul.size()) # 16 x 10 x 20 x 50
这里,
mul
tensor是您想要的结果。为了澄清,与
c
d
计算相关的上述两行相当于:

c = a.unsqueeze(2).expand(a.size(0), a.size(1), b.size(1), a.size(2))
d = b.unsqueeze(1).expand(b.size(0), a.size(1), b.size(1), b.size(2))

再次感谢你。你的代码很好。为了澄清我的理解,我更新了我的帖子。