在使用pytorch训练深度神经网络时每一个batch的训练需要使用 optimizer.zero_grad() 来清除掉之前batch的gradients。但是zero_grad()的使用位置具体应该放在哪里似乎有多种情况,例如以下的两种情况是否存在逻辑区别,正确的方法应该使用哪一种?
方法1:
for inputs, labels in train_loader:
optimizer.zero_grad()
output = model(inputs)
loss = loss_f(output, labels)
loss.backward()
optimizer.step()
方法2:
for inputs, labels in train_loader:
output= model(inputs)
loss = criterion(output, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
个人感觉方法2是不是会清除掉前面计算过程的gradient, 但是这种结构也很常见而且实际运用也没有发现问题。
https://discuss.pytorch.org/t/where-should-i-place-zero-grad/101886
引用这条回答,两种方法都可行,zero_grad()只要不出现在loss.backward() 和 optimizer.step() 之间即可。