通过torch.nn定义好网络结构以后就要使用一定的优化方法对网络进行训练了,这涉及到优化模块torch.optim
1.创建一个optimizer实例
注意事项:如果需要在GPU上训练,需要在创建optimizer之前就移动到GPU上,在创建optimizer时必须保证所有待优化变量都储存在一块连续的空间内。
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)
分参数选项:
这是输入不是parameter,而是一个dict,通过一个key键值把parameters分成不同组,不同组的参数可以选用不同的训练参数
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
2.执行一步优化
有两种方式
1)optimizer.step()
一旦梯度算出来了,就可以紧接着用这个函数来优化参数
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
2)optimizer.step(closure)
对于某些需要循环计算的优化方法,例如共轭梯度法、LBFGS等,需要定义一个closure闭环,这个闭环里要进行清空梯度、计算loss、返回loss
for input, target in dataset:
def closure():
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
return loss
optimizer.step(closure)