为步骤添加手动渐变

2024-09-30 14:34:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有任何方法可以在pytorch中手动添加渐变,同时使用autograd。在我的损失函数中有一个中间步骤,如果不将数据类型从张量中转换出来,我就无法计算,因此我无法获得该分量的自动标记,因此梯度无法正确计算。但是,我可以手动计算梯度。我将如何将其合并到pytorch中的渐变图中?我找到的所有指南根本不使用自动标签(据我所知)

我试图解决的具体问题是在某个时间间隔内规范化函数。下面的示例对高斯数之和执行此操作。张量m为[[m1,m2,m3,m4…],表示平均值,s表示标准偏差,p表示权重。p、 m和s都是我的模型的输出。我希望低截止点和高截止点之间的积分为1,所以我可以通过取高截止点处的cdf,然后减去低截止点cdf,然后再将所有ps除以该值得到。然后我将使用这些新的p值(连同m和s以及一个目标)来计算损失函数的一些值。然后当我调用loss.backward()时,我会得到正确的梯度,包括标准化因子随p、m和s的变化而变化的梯度部分

    normFactor=0
    for gaussianInd in range(numberGaussians):
        normFactor += (spstats.norm.cdf(higherCutoff,m[0][gaussianInd].cpu().detach(),s[0][gaussianInd].cpu().detach()+1e-6)-spstats.norm.cdf(lowerCutoff,m[0][gaussianInd].cpu().detach(),s[0][gaussianInd].cpu().detach()+1e-6))*p[0][gaussianInd]
    p=p/normFactor

编辑:添加了具体示例


Tags: 方法函数norm示例pytorch手动cpu梯度
1条回答
网友
1楼 · 发布于 2024-09-30 14:34:05

当然,您始终可以修改感兴趣的张量的^{}属性。优化器将点击此属性以更新相应的张量


为了便于说明:

>>> p = nn.Linear(10, 1, bias=False)
>>> p.weight
Parameter containing:
tensor([[ 0.3148, -0.2287,  0.1254, -0.1360,  0.2799, -0.0225, -0.3006, -0.0605,
         -0.2784, -0.2618]], requires_grad=True)

>>> optim = torch.optim.SGD(p.parameters(), lr=.1)

手动修改渐变:

>>> p.weight.grad = torch.rand_like(p.weight)

使用优化器更新:

>>> optim.step()

参数将得到更新:

>>> p.weight
Parameter containing:
tensor([[ 0.2514, -0.2555,  0.1026, -0.1881,  0.2529, -0.0497, -0.3750, -0.1489,
         -0.3762, -0.2839]], requires_grad=True)

相关问题 更多 >