了解双线性层

2024-06-02 05:48:45 发布

您现在位置:Python中文网/ 问答频道 /正文

当Pythorch中有一个双线性层时,我不知道如何计算。在

下面是一个小例子,我试图弄清楚它是如何工作的:

输入:

import torch.nn as nn
B = nn.Bilinear(2, 2, 1)
print(B.weight)

输出:

^{pr2}$

我要通过一个零向量和一个向量。在

输入:

print(B(torch.ones(2), torch.zeros(2)))
print(B(torch.zeros(2), torch.ones(2)))

输出:

tensor([0.2175], grad_fn=<ThAddBackward>)
tensor([0.2175], grad_fn=<ThAddBackward>)

我试着用各种方法把重量加起来,但结果不一样。在

提前谢谢!在


Tags: importasoneszerosnntorch向量例子
1条回答
网友
1楼 · 发布于 2024-06-02 05:48:45

nn.Bilinear完成的操作是B(x1, x2) = x1*A*x2 + b(c.f.doc),其中:

  • A存储在nn.Bilinear.weight
  • b存储在nn.Bilinear.bias

如果你考虑到(可选)偏差,你应该得到预期的结果。在


import torch
import torch.nn as nn

def manual_bilinear(x1, x2, A, b):
    return torch.mm(x1, torch.mm(A, x2)) + b

x_ones = torch.ones(2)
x_zeros = torch.zeros(2)

#              -
# With Bias:

B = nn.Bilinear(2, 2, 1)
A = B.weight
print(B.bias)
# > tensor([-0.6748], requires_grad=True)
b = B.bias

print(B(x_ones, x_zeros))
# > tensor([-0.6748], grad_fn=<ThAddBackward>)
print(manual_bilinear(x_ones.view(1, 2), x_zeros.view(2, 1), A.squeeze(), b))
# > tensor([[-0.6748]], grad_fn=<ThAddBackward>)

print(B(x_ones, x_ones))
# > tensor([-1.7684], grad_fn=<ThAddBackward>)
print(manual_bilinear(x_ones.view(1, 2), x_ones.view(2, 1), A.squeeze(), b))
# > tensor([[-1.7684]], grad_fn=<ThAddBackward>)

#              -
# Without Bias:

B = nn.Bilinear(2, 2, 1, bias=False)
A = B.weight
print(B.bias)
# None
b = torch.zeros(1)

print(B(x_ones, x_zeros))
# > tensor([0.], grad_fn=<ThAddBackward>)
print(manual_bilinear(x_ones.view(1, 2), x_zeros.view(2, 1), A.squeeze(), b))
# > tensor([0.], grad_fn=<ThAddBackward>)

print(B(x_ones, x_ones))
# > tensor([-0.7897], grad_fn=<ThAddBackward>)
print(manual_bilinear(x_ones.view(1, 2), x_ones.view(2, 1), A.squeeze(), b))
# > tensor([[-0.7897]], grad_fn=<ThAddBackward>)

相关问题 更多 >