我正在从事一个玩具项目,以比较SGD和SGD+momentum优化器在MNIST数据上的性能。为此,我创建了两个单元格块,一个用于SGD:
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0)
for epoch in range(10):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 2000 == 1999:
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 2000))
running_loss = 0.0新交所10期后的损失:损失: 0.674
然后,我为SGD+momentum创建了另一个单元:
sgd_momentum = optim.SGD(net.parameters(), lr=0.001, momentum=0.7)
for epoch in range(10):
#similar as in SGD, just replace the optimizer我面临的问题是,SGD+momentum正试图从SGD停止的那一刻开始优化。这是第一批小型车的损失,划时代1:
1,2000年损失: 0.506
如何确保SGD+momentum接受最初的损失?我不明白这是什么原因。
发布于 2022-01-12 05:03:37
在PyTorch中,一旦使用了optim.step(),权重优化就自动开始(前提是没有设置其他标志)。
在使用第二个优化器之前调用model = model() / Net()是可行的,因为它重新初始化了网络
https://stackoverflow.com/questions/70676004
复制相似问题