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)
第一种方法
loss1 = model(x).mean()
loss2 = model(y).mean()
(loss1+loss2).backward()
optimizer.step()
我想转发两个数据集,它们的总损失将用于向后和更新一个模型。这种做法正确吗?
#2 方法
loss1 = model(x).mean()
loss1.backward()
loss2 = model(y).mean()
loss2.backward()
optimizer.step()
第一种方法和第二种方法有什么区别?
最佳答案
它们实际上是等价的:梯度在反向传播中累加(对于在计算图中多次出现的节点来说这是一个方便的实现)。所以它们几乎是相同的。
但是为了使代码可读并真正清楚地表明正在发生的事情,我更喜欢第一种方法。第二种方法(如上所述)基本上是“滥用”累积梯度的效果 - 它实际上不是滥用,但它更常见,正如我所说,使用第一种方法更容易阅读。
关于deep-learning - pytorch如何进行多次前向传播和一次反向传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73979121/