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

标签 deep-learning pytorch loss-function gradient-descent

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/

相关文章:

swift - 将 pytorch 转换为 torchscript 后的不同结果?将 NSnumber 转换为 Float 会造成任何损失吗?

python - keras 中的 categorical_crossentropy 是如何实现的?

tensorflow - 神经网络可以处理冗余输入吗?

machine-learning - 设置 Deep Q-Learning 的目标值

c++ - Caffe中的批处理模式

python-3.x - 根据pytorch数据集中的文件名拆分数据集

python - 意外的导入行为 : non-existing module imported

keras - 在不运行模型的情况下计算 Keras 中的损失

deep-learning - 人们为 imagenet 实验选择 224x224 图像大小有什么特别的原因吗?

python - 将 Tensorflow 中 Tensor 的所有元素相乘