如果有的话,这段代码可能存在哪些问题?
训练时好像没有
optimizer.zero_grad()
?
import torch
import torch.nn as nn
import torch.optim as optim
import pdb
model = nn.Linear(10, 1)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
x = torch.randn(100, 10)
y = torch.randn(100, 1)
for i in range(100):
outputs = model(x)
loss = criterion(outputs, y)
loss.backward()
optimizer.step()
是的,你没看错。这是一个重要的步骤;否则,梯度会在反向传播时从一次迭代累积到另一次迭代,从而显示错误的结果。要解决这个问题,您只需在反向传播之前将梯度设为零即可。见下图:
for i in range(100):
outputs = model(x)
loss = criterion(outputs, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()