PyTorch两个变量的两个损失

时间:2020-05-13 03:31:34

标签: python pytorch loss-function autograd

这是有关PyTorch autograd.grad和后退功能的问题。

我有两个张量ab经过优化(即需要梯度)。

我定义了loss1, loss2 = f(a,b), g(a,b)。尽管这是两个独立的函数fg,但是出于计算效率的考虑,我必须将它们两个都作为fg(a,b)一起计算,并返回一个元组(loss1, loss2)

我需要使用opt_aopt_b(优化程序)通过以下渐变来逐步执行ab

a.grad应该等于d(loss1)/ d(a

b.grad应该等于d(loss2)/ d(b

如何获得这些渐变?我知道我可以运行autograd.grad(loss1, a)autograd.grad(loss2, b)来获取真实的渐变并将其手动设置为*.grad,但是我想在loss1和{{ 1}}。

我想使用向后方法,因为在我的情况下,a和b实际上是两个神经网络的参数列表(我不想手动设置loss2)时,它是简洁的代码。

是否可以使用param.grad = ... for param in model1.parameters()来做到这一点?


我的尝试

我尝试了以下方法的多个有序变体(但是它们都不起作用,因为渐变至少会为一个变量添加):

.backward()

此命令的不同阶导致梯度(d({loss1, loss2 = fg(...) opt1.zero_grad() loss1.backward(retain_graph=True) opt1.step() opt2.zero_grad() loss2.backward() opt2.step() )/ d(loss1+loss2)的累加,或者导致一个优化器将a的值步进,然后我可以'由于就地更改了操作,因此不运行a

我使用了一些测试代码: enter image description here

0 个答案:

没有答案