提取用于在 PyTorch 中拟合数据的参数和梯度范数

问题描述 投票:0回答:1

我试图提取在 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()

谢谢!

pytorch parameters gradient
1个回答
0
投票

这是由于您的

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 范数,然后计算平均值。

© www.soinside.com 2019 - 2024. All rights reserved.