文章目录
- 1. 训练模型步骤
- 2. 训练模型API
- 3. 训练模型
学习目标:掌握PyTorch构建线性回归模型相关API
1. 训练模型步骤
我们使用 PyTorch 的各个组件来构建线性回归的实现。在pytorch中进行模型构建的整个流程一般分为四个步骤:
- 准备训练数据集
- 构建要使用的模型
- 设置损失函数及优化器
- 训练模型
2. 训练模型API
- 使用 PyTorch 的
nn.MSELoss()
代替自定义的平方损失函数 - 使用 PyTorch 的
data.DataLoader
代替自定义的数据加载器 - 使用 PyTorch 的
optim.SGD
代替自定义的优化器 - 使用 PyTorch 的
nn.Linear
代替自定义的假设函数
3. 训练模型
具体代码:
# 导入相关模块
import torch
from sympy import false
from torch.utils.data import TensorDataset # 构造数据集对象
from torch.utils.data import DataLoader # 数据加载器
from torch import nn # nn模块中有平方损失函数和假设函数
from torch import optim # optim 模块中有优化器函数
from sklearn.datasets import make_regression # 创建线性回归模型数据集
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号# 数据集构建
def create_dataset():x, y, coef = make_regression(n_samples=100,n_features=1,noise=10,coef=True,bias=1.5,random_state=0)x = torch.tensor(x)y = torch.tensor(y)return x, y, coefdef train():# 1. 构造数据集x, y, coef = create_dataset()# 构造数据集对象dataset = TensorDataset(x, y)# 构造数据加载器# dataset=:数据集对象# batch_size=:批量训练样本数据# shuffle=:样本数据是否进行乱序dataloader = DataLoader(dataset=dataset, batch_size=16, shuffle=True)# 2. 构造模型# in_features=:输入张量的大小size# out_features=:输出张量的大小sizemodel = nn.Linear(in_features=1, out_features=1)# 3.设置损失函数和优化器# 构造平方损失函数criterion = nn.MSELoss()# 构造优化函数optimizer = optim.SGD(model.parameters(), lr=1e-2)# 4.训练模型epochs = 100# 损失变化loss_epochs = []total_loss=0.0train_sample=0.0for _ in range(epochs):for train_x,train_y in dataloader:# 将一个batch的训练数据送入模型y_pred = model(train_x.type(torch.float32))# 计算损失函数值loss = criterion(y_pred, train_y.reshape(-1, 1).type(torch.float32))total_loss += loss.item()train_sample += len(train_x)# 梯度清零optimizer.zero_grad()# 自动微分(反向传播)loss.backward()# 更新参数optimizer.step()# 获取每次batch的损失loss_epochs.append(total_loss/train_sample)# 绘制损失变化曲线plt.plot(range(epochs), loss_epochs)plt.title('损失变化曲线')plt.grid()plt.show()# 绘制拟合直线plt.scatter(x,y)x = torch.linspace(x.min(), x.max(), 1000)y1 = torch.tensor([v * model.weight + model.bias for v in x])y2 = torch.tensor([v * coef +1.5 for v in x])plt.plot(x, y1,label='训练')plt.plot(x, y2,label='真实')plt.grid()plt.legend()plt.show()if __name__ == '__main__':# 生成数据# x, y, coef = create_dataset()# # 绘制数据的真实线性回归结果# plt.scatter(x,y)# x = torch.linspace(x.min(), x.max(),1000)# y1 = torch.tensor([v * coef + 1.5 for v in x])# plt.plot(x,y1,label='real')# plt.grid()# plt.legend()# plt.show()train()
输出结果: