pytorch如何进行多次前向传播和一次反向传播?

kow*_*r66 2 gradient-descent deep-learning pytorch loss-function

import torch
import torchvision.models as models
model = models.resnet18()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
x = torch.randn(1, 3, 224, 224)
y = torch.randn(1, 3, 224, 224)
Run Code Online (Sandbox Code Playgroud)

#第一种方法

loss1 = model(x).mean()
loss2 = model(y).mean()
(loss1+loss2).backward()
optimizer.step()
Run Code Online (Sandbox Code Playgroud)

我想转发两个数据集,它们的总损失将用于向后和更新一个模型。这种做法正确吗?

#第二种方法

loss1 = model(x).mean()
loss1.backward()
loss2 = model(y).mean()
loss2.backward()
optimizer.step()
Run Code Online (Sandbox Code Playgroud)

第一种方法和第二种方法有什么区别?

fla*_*awr 5

它们实际上是等效的:梯度在反向传播中累加(对于在计算图中多次出现的节点来说这是一个方便的实现)。所以它们两者几乎相同。

但为了使代码可读并真正清楚地表明正在发生的事情,我更喜欢第一种方法。第二种方法(如上所述)基本上是“滥用”累积梯度的效果 - 它实际上不是滥用,但它更常见,正如我所说,使用第一种方法更容易阅读。