Optimization 如何在chainer的更新规则中获取损失值

Optimization 如何在chainer的更新规则中获取损失值,optimization,loss,chainer,Optimization,Loss,Chainer,我试图修改chainer的一个类SGDRule(optimizer.UpdateRule),使之成为我原来的优化器 为了达到我想要的,我不仅需要得到梯度,还需要得到损耗 在通过反向传播生成梯度之前,必须执行产生损耗的正向路径。我需要那种损失 问题是我必须从类中的update_core_gpu(self,param)代码访问丢失 我了解到分类器对象具有作为属性的损失。但是,我不知道如何从更新规则访问对象 作为替代方案,我考虑使用我可以从代码访问的Reporter对象。我知道如何将价值传递给报告者,

我试图修改chainer的一个类SGDRule(optimizer.UpdateRule),使之成为我原来的优化器

为了达到我想要的,我不仅需要得到梯度,还需要得到损耗

在通过反向传播生成梯度之前,必须执行产生损耗的正向路径。我需要那种损失

问题是我必须从类中的update_core_gpu(self,param)代码访问丢失

我了解到分类器对象具有作为属性的损失。但是,我不知道如何从更新规则访问对象

作为替代方案,我考虑使用我可以从代码访问的Reporter对象。我知道如何将价值传递给报告者,但不知道如何获得报告者的损失


有人知道如何在更新代码规则中获取当前损失吗?

如果您使用的是保存损失的模型,例如
分类器
,一种简单但可能不那么优雅的方法是将模型传递给
优化器
,然后在
优化器中构建时传递给每个
更新程序
。创建更新规则
。如果您不想传递模型,您可能会传递一个lambda,该lambda返回模型中的损失

另一种可能是一种更干净的方法(如果对您的情况足够的话),就是实现一个优化器挂钩,类似于在Chainer中实现渐变剪裁的方式。看见您可以通过
opt.target.loss
opt.target
)获得损失
例如,在优化步骤之前更新渐变。

谢谢您的帮助!优化器挂钩似乎是我应该尝试的,因为我希望我的优化器可以在不改变其他代码的情况下替换现有的优化器。因为我不太熟悉这个钩子,我想问一下它,以便澄清。我可以从更新规则代码访问我在钩子中得到的损失吗?或者,我应该为钩子中的更新规则做所有事情吗?谢谢。从技术上讲,由于您可以访问钩子中的优化器
opt
,因此可以使用
opt.target.params
获取参数,对于每个参数
p
,您可以通过
p.update\u rule
获取更新规则。然后,您可以根据需要修改更新规则,例如,将丢失存储在某些属性中,以便以后在更新中访问。这是一个责任分离的问题。理想情况下,钩子应该只做与更新相关的任何前/后处理,在您的情况下,这取决于丢失,而不是更新本身(这可能会干扰其他钩子)。再次感谢您!我还是不确定,但我是这样想的。在chainer/optimizer\uhooks目录中,我应该编写一个hook类(myhook)。当我创建优化器类的对象时,
myopt(optimizer.GradientMethod)
,我可以作为“self”访问该对象,我应该在myopt类的初始值设定项中编写
self.add_hook(chainer.optimizer_hooks.myhook())
。然后,正如您所写,我可以从钩子访问目标和update_规则。你的建议很有帮助。非常感谢。