在softmax之后,PyTorch权重不会更新

问题描述

我正在使用PyTorch来执行优化问题,该问题正在寻找一组权重w,以便可以使用xsum(w * x) / sum(w))的加权平均值估算一些变量,例如y

下面是我的pytorch的“模特”,

dtype = torch.float
device = torch.device('cpu')

class WAvg(nn.Module):
    def __init__(self,p):
        super(WAvg,self).__init__()
        self.p = p
        self.q = nn.Parameter(torch.randn(self.p,1,device=device,dtype=dtype))
        self.w = nn.functional.softmax(self.q,dim=0)
    def forward(self,x):
        w_avg = nn.functional.linear(x,self.w.T)
        return w_avg

培训代码

x_tr = np.array([
    [1,1],[1,4,[2,6],2,3],[4,-3],2] 
])
y_tr = np.array([1,2.1,3.9,1.2,1.8])

x_tr = torch.from_numpy(x_tr).float()
y_tr = torch.from_numpy(y_tr).float()


wa = WAvg(3)

criterion = nn.MSELoss()
optimizer = optim.Adam(wa.parameters(),lr=0.01)

for epoch in range(10):
    # Set running loss
    running_loss_tr = 0.0
    # zero the parameter gradients
    optimizer.zero_grad()
    # forward + backward + optimize
    y_pred_tr = wa(x_tr)
    loss_tr = criterion(y_pred_tr,y_tr)
    loss_tr.backward()
    optimizer.step()
    # print statistics
    print(epoch,loss_tr.item())

这会出错

RuntimeError:尝试第二次向后浏览图形,但缓冲区已被释放。第一次回叫时,请指定keep_graph = True。

retain_graph=True添加了自变量loss_tr.backward()(如本post中的建议),但似乎参数qw并未更新。我认为问题应该是由softmax造成的,这些0 1.305460810661316 1 1.305460810661316 2 1.305460810661316 3 1.305460810661316 4 1.305460810661316 5 1.305460810661316 6 1.305460810661316 7 1.305460810661316 8 1.305460810661316 9 1.305460810661316 限制了权重,使得权重之和为1,是否有任何线索可以解决

输出

selectByVisibleText()

解决方法

optimizer = optim.Adam(ma.parameters(),lr=0.01)

'ma'.parameters()....你不是说吗?

这是问题。

它说明了为什么您没有更新正确的参数,并且由于没有将正确的梯度归零,也说明您在同一张图中向后传播了两次。