【发布时间】:2019-04-12 15:52:48
【问题描述】:
作为 pytorch 框架 (0.4.1) 中的一个练习,我试图在一个简单的线性层 (Z = X.W + B) 中显示 X(gX 或 dSdX)的梯度。为了简化我的玩具示例,我从 Z 的总和(不是损失)中后退()。
总而言之,我想要 S=sum(XW+B) 的 gX(dSdX)。
问题是Z(dSdZ)的梯度是None。结果,gX当然也是错的。
import torch
X = torch.tensor([[0.5, 0.3, 2.1], [0.2, 0.1, 1.1]], requires_grad=True)
W = torch.tensor([[2.1, 1.5], [-1.4, 0.5], [0.2, 1.1]])
B = torch.tensor([1.1, -0.3])
Z = torch.nn.functional.linear(X, weight=W.t(), bias=B)
S = torch.sum(Z)
S.backward()
print("Z:\n", Z)
print("gZ:\n", Z.grad)
print("gX:\n", X.grad)
结果:
Z:
tensor([[2.1500, 2.9100],
[1.6000, 1.2600]], grad_fn=<ThAddmmBackward>)
gZ:
None
gX:
tensor([[ 3.6000, -0.9000, 1.3000],
[ 3.6000, -0.9000, 1.3000]])
如果我使用 nn.Module,我得到完全相同的结果,如下所示:
class Net1Linear(torch.nn.Module):
def __init__(self, wi, wo,W,B):
super(Net1Linear, self).__init__()
self.linear1 = torch.nn.Linear(wi, wo)
self.linear1.weight = torch.nn.Parameter(W.t())
self.linear1.bias = torch.nn.Parameter(B)
def forward(self, x):
return self.linear1(x)
net = Net1Linear(3,2,W,B)
Z = net(X)
S = torch.sum(Z)
S.backward()
print("Z:\n", Z)
print("gZ:\n", Z.grad)
print("gX:\n", X.grad)
【问题讨论】:
标签: artificial-intelligence pytorch gradient-descent