我想知道是否有任何方法可以在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
编辑:添加了具体示例
当然,您始终可以修改感兴趣的张量的^{} 属性。优化器将点击此属性以更新相应的张量
为了便于说明:
手动修改渐变:
使用优化器更新:
参数将得到更新:
相关问题 更多 >
编程相关推荐