1 步骤
- 准备数据集
- 设计模型 构造计算图 继承自nn.Module
- 构造损失函数和训练器 使用pytorch接口
- 训练循环 前馈算损失,反馈算梯度,更新权值
2 代码
import torch
import matplotlib.pyplot as plt
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): #继承自nn.Module
#__init__,forward这两个函数必须实现
def __init__(self):
super(LinearModel,self).__init__()
#nn.Linear类包含两个成员张量weight和bias
self.linear=torch.nn.Linear(1,1) #构造对象(也继承自nn.Module)
#输入特征数为1,输出特征数为1
def forward(self,x):
#nn.Linear类实现了__call__(),使得该类实例可以像函数一样调用
#通常情况下forward()将被调用
y_pred=self.linear(x) #这是一个可调用对象callable
return y_pred
#创建一个LinearModel类实例
model=LinearModel()
#size_average=False表示不求均值,求不求均值对结果无影响
criterion=torch.nn.MSELoss(size_average=False) #构造对象,也继承自nn.Module
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
#第一个参数是取得模型中的全部参数(可以嵌套调用),lr表示学习率
epoch_list=[]
loss_list=[]
for epoch in range(1000):
y_pred=model(x_data) #前馈预测
loss=criterion(y_pred,y_data) #前馈损失
#loss是一个对象,自动调用__str__函数
print(epoch,'loss=',loss.item())
epoch_list.append(epoch)
loss_list.append(loss.item())
optimizer.zero_grad() #求导前需要将所有权重设置为0
loss.backward() #自动求导,loss必须是标量,不然不能backward
optimizer.step() #更新
#输出weight和bias,如果不加item(),那么它是一个矩阵
print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())
#测试模型
x_test=torch.Tensor([[4.0]])
y_test=model(x_test)
print('y_pred=',y_test.data)
plt.plot(epoch_list,loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
3 比较不同优化器的结果
3.1 SGD