问题描述
我正在使用PyTorch
来执行优化问题,该问题正在寻找一组权重w
,以便可以使用x
(sum(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中的建议),但似乎参数q
或w
并未更新。我认为问题应该是由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()....你不是说吗?
这是问题。
它说明了为什么您没有更新正确的参数,并且由于没有将正确的梯度归零,也说明您在同一张图中向后传播了两次。