我试图提取在 PyTorch 的拟合函数期间计算的值:参数本身;和梯度的 L-2 范数。这是我实现这些目标的代码。
def get_theta(self):
theta = self.parameters().detach().cpu
return theta
def fit(self, loader, epochs = 2000):
norm2Gradient = 1
while norm2Gradient >10e-3 and epochs <2000:
#grad = []
for _, batch in enumerate(loader):
x, y = batch['x'], batch['y']
#computes f.cross_entropy loss of (xb,yb) on GPU
loss = self.loss(x,y)
#print("loss:", loss)
loss = loss.mean()
#print("loss mean:", loss)
#clears out old gradients
self.optimizer.zero_grad()
#calculates new gradients
grad = loss.backward()
print("grad:",grad)
#takes one step along new gradients to decrease the loss
self.optimizer.step()
#captures new parameters
theta = self.parameters()
print("theta:",theta)
#collects gradient along new parameters
for param in theta:
grad.append(param.grad)
#computes gradient norm
norm2Gradient = torch.linalg.norm(grad)
sumNorm2Gradient += norm2Gradient.detach().cpu
return sumNorm2Gradient
这是重复出现的错误消息
AttributeError: 'NoneType' object has no attribute 'append'
它发生在这行代码。
grad.append(param.grad)
我打印了 grad 变量,它显示“无”。
我的目的是使用以下代码行捕获渐变。
grad = loss.backward()
获得拟合函数期间计算的梯度的更好方法是什么?
同样:这一行是否捕获参数?
theta = self.parameters()
谢谢!
这是由于您的
while
条件出现错误
def fit(self, loader, epochs = None):
#loss_mean = []
norm2Gradient = 1
while norm2Gradient <10e-3 and epochs <2000:
...
return grad
自
norm2Gradient = 1
起,条件 norm2Gradient <10e-3
变为 False
并且 while
循环永远不会执行。当 return grad
变量尚未分配时,该函数会尝试 grad
。这会触发错误。
也就是说,您的方法还有另一个问题。你的梯度张量将具有不同的形状,因此你不能将它们串在一个列表中并计算它们的 L2 范数。您可能想单独计算每个梯度张量的 L2 范数,然后计算平均值。