选用其中四种
Rprop优化器:
#第一步 准备数据集
import torch
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[2.0],[4.0],[6.0]])
#第二步 设计模型类
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel,self).__init__()
self.linear=torch.nn.Linear(1,1)#包括w,b两个tensor
def forward(self,x):
y_pred=self.linear(x)#实现一个可调用的对象
return y_pred
model=LinearModel()
#第三步 构造损失函数和优化器
criterion=torch.nn.MSELoss(size_average=False)optimizer=torch.optim.Rprop(model.parameters(),lr=0.01)#优化器,lr为学习率
epoch_list=[epoch for epoch in range(100)]
loss_list=[]
#第四步 训练周期
for epoch in range(100):
y_pred=model(x_data)#predict
loss=criterion(y_pred,y_data)#loss
print(epoch,loss)#打印loss时自动调用__str__(),不会产生计算图
loss_list.append(loss.item())
optimizer.zero_grad()#梯度归零
loss.backward()#反向
optimizer.step()#更新
#output weight and bias
print('w=',model.linear.weight.item())#item()取出矩阵里的值
print('b=',model.linear.bias.item())
#test model
x_test=torch.Tensor([[4.0]])
y_test=model(x_test)
print('y_pred=',y_test.data)
#绘制epoch-loss图
import matplotlib.pyplot as plt
plt.plot(epoch_list,loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
运行结果(学习率:0.01 训练100次):
图1 Rprop优化器下的epoch-loss图
Adagrade优化器:
#仅展示第三步 构造损失函数和优化器
criterion=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.Adagrad(model.parameters(),lr=0.01)
运行结果(学习率:0.01 训练1000次):
w= -0.022234104573726654 b= 0.6071299910545349 y_pred= tensor([[0.5182]])
图2 Adagrade优化器(lr=0.01)下的epoch-loss图
运行结果(学习率:0.1 训练1000次):
w= 1.9602395296096802 b= 0.0879262387752533 y_pred= tensor([[7.9289]])
图3 Adagrade优化器(lr=0.1)下的epoch-loss图
Adam优化器(学习率:0.01 训练1000次):
#第三步 构造损失函数和优化器
criterion=torch.nn.MSELoss(size_average=False)#MSELoss也继承自Module,构造了对象criterion,需要参数(y_pred,y)计算损失
optimizer=torch.optim.Adam(model.parameters(),lr=0.05)
w= 1.5380566120147705 b= 1.023187279701233 y_pred= tensor([[7.1754]])
图4 Adam优化器下的epoch-loss图
LBFGS优化器:
#第三步 构造损失函数和优化器
loss_list=[]
criterion=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.LBFGS(model.parameters(),lr=0.01)
def closure():
optimizer.zero_grad()
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
loss_list.append(loss.item())
loss.backward()
return loss
#第四步 训练周期
for epoch in range(100):
optimizer.step(closure)#更新
运行结果(学习率:0.01 训练100次):
图5 LBFGS优化器下的epoch-loss图