Pytorch深度学习实践(4)使用Pytorch实现线性回归

使用Pytorch实现线性回归

基本步骤:

  • 准备数据集
  • 设计模型
  • 构造损失函数和优化器
  • 模型训练
    • forward计算损失
    • backward计算梯度
    • update更新参数

准备数据集

y p r e d ( 1 ) y p r e d ( 2 ) y p r e d ( 3 ) \] = ω \[ x ( 1 ) x ( 2 ) x ( 3 ) \] + b \\begin {bmatrix}y_{pred}\^{(1)} \\\\ y_{pred}\^{(2)} \\\\ y_{pred}\^{(3)} \\end{bmatrix} =\\omega \\begin {bmatrix}x\^{(1)} \\\\ x\^{(2)} \\\\ x\^{(3)} \\end{bmatrix} + b ypred(1)ypred(2)ypred(3) =ω x(1)x(2)x(3) +b ```python import torch ## 注意x和y的值必须是矩阵 x_data = torch.tensor([[1.0], [2.0], [3.0]]) y_data = torch.tensor([[2.0], [4.0], [6.0]]) ``` #### 设计模型 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/21bd32f182db4d168d2dca84b5f14d61.png) 在Pytorch里,重点是构造**计算图** 在这里使用的是仿射模型,即线性单元 z = w x + b z = wx + b z=wx+b 需要确定的是 w w w 和 b b b 的维度大小,即要通过输入和输出的维度来确定权重的维度 **必须注意的是 l o s s loss loss一定要是一个标量** 一般而言,会把模型设计成类 ```python class LinearModel(torch.nn.Module): #继承自Module def __init__(self): #构造函数 super(LinearModel, self).__init__() # 调用负类的构造 self.linear = torch.nn.Linear(1, 1) # 构造Linear对象 包含权重和偏置 def forward(self, x): y_pred = self.linear(x) return y_pred model = LinearModel() # 实例化LinearModel()对象 ``` `torch.nn.Linear(in_features, out_features, bias=True)`参数: * `in_features` 输入的每一个样本的维度 * `out_features` 输出的每一个样本的维度 * `bias` 是否需要添加偏置,默认为`True` `forward()`方法中`y_pred = self.linear(x)`调用的是了python中的`__call__`函数。在Pytorch的`Module.__call__()`中有一个重要的语句就是`forward()`,也就是说,在这里我们必须写`forward()`来去覆盖 #### 定义损失函数和优化器 ##### 损失函数 损失函数使用`MSE` ```python criterion = torch.nn.MSELoss(size_average=False) ``` 参数设置: * `size_average`,是否对损失求平均,默认为`True` * `reduce`,用来确定是否要把损失求和降维(特征降维) 一般而言,只考虑`size_average` ##### 优化器 使用梯度下降 ```python optimizer = torch.optim.SGD(model.parameters(), lr=0.01) ``` 参数设置: * `params`,传入模型需要优化的权重 * `lr`,学习率 #### 模型训练 训练100次,主要是三个步骤 * 前馈计算 * 反向传播 * 梯度更新 注意不要忘记**梯度清零** ```python for epoch in range(100): y_pred = model(x_data) # 前馈计算 loss = criterion(y_pred, y_data) # 计算损失 print(epoch, loss) optimizer.zero_grad() # 梯度清零 loss.backward() # 反向传播 optimizer.step() # 参数更新 ## 损失数据可视化 plt.plot(np.arange(100), loss_history) plt.xlabel('epoch') plt.ylabel('loss') plt.show() ## 打印训练后的参数 print("w = ", model.linear.weight.item()) print("b = ", model.linear.bias.item()) ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d21a1864a1a43afa566383777f5a69b.png) #### 模型测试 ```python x_test = torch.tensor([[4.0]]) y_test = model(x_test) print("y_pred = ", y_test.item()) ``` 测试结果如下 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/996eaa7dbca2410f93720c57e78d1818.png) #### 整体代码 ```python import torch import matplotlib.pyplot as plt import numpy as np ## 注意x和y的值必须是矩阵 x_data = torch.tensor([[1.0], [2.0], [3.0]]) y_data = torch.tensor([[2.0], [4.0], [6.0]]) loss_history = [] ########## 模型的定义 ########## class LinearModel(torch.nn.Module): #继承自Module def __init__(self): #构造函数 super(LinearModel, self).__init__() self.linear = torch.nn.Linear(1, 1) def forward(self, x): y_pred = self.linear(x) return y_pred model = LinearModel() # 实例化Linear()对象 ########## 定义损失函数和优化器 ########## ## 损失函数 criterion = torch.nn.MSELoss(size_average=False) ## 优化器 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) ########## 模型训练 ########## for epoch in range(100): y_pred = model(x_data) # 前馈计算 loss = criterion(y_pred, y_data) # 计算损失 print(epoch, loss) loss_history.append(loss.item()) optimizer.zero_grad() # 梯度清零 loss.backward() # 反向传播 optimizer.step() # 参数更新 ## 损失数据可视化 plt.plot(np.arange(100), loss_history) plt.xlabel('epoch') plt.ylabel('loss') plt.show() ## 打印训练后的参数 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.item()) ```

相关推荐
程序员打怪兽13 小时前
详解Visual Transformer (ViT)网络模型
深度学习
CoovallyAIHub3 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
用户1474853079743 天前
AI-动手深度学习环境搭建-d2l
深度学习
OpenBayes贝式计算3 天前
解决视频模型痛点,TurboDiffusion 高效视频扩散生成系统;Google Streetview 涵盖多个国家的街景图像数据集
人工智能·深度学习·机器学习
OpenBayes贝式计算3 天前
OCR教程汇总丨DeepSeek/百度飞桨/华中科大等开源创新技术,实现OCR高精度、本地化部署
人工智能·深度学习·机器学习
在人间耕耘4 天前
HarmonyOS Vision Kit 视觉AI实战:把官方 Demo 改造成一套能长期复用的组件库
人工智能·深度学习·harmonyos