当前位置: 首页 > news >正文

【机器学习深度学习】线性回归(基本模型训练流程)

目录

线性回归示例

执行过程

执行代码 

运行结果

代码解析

1 库名讲解

2 定义模型结构

3 初始化模型、损失函数、优化器

4 构造训练数据

5 开始训练(重复 1000 次)

6 模型训练好之后进行预测


线性回归示例

这段代码使用 PyTorch 构建并训练了一个简单的线性回归模型,使其能够拟合输入 x和目标 y之间的关系,然后用训练好的模型预测 x=4.0 时的结果。

执行过程

这段代码是 PyTorch 实现线性回归的完整流程,展示了:

模型定义 → 损失函数 → 训练数据 → 前向传播 → 反向传播(链式法则) → 参数更新 → 预测的全过程。


执行代码 

import torch
import torch.nn as nn
import torch.optim as optim# 定义一个简单的线性回归模型
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.fc = nn.Linear(1, 1)  # 输入1维,输出1维def forward(self, x):return self.fc(x)# 初始化模型、损失函数和优化器
model = LinearRegression()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)# 训练数据
x = torch.tensor([[1.0], [2.0], [3.0]])
y_true = torch.tensor([[3.0], [5.0], [7.0]])# 训练循环
for epoch in range(1000):  # 增加训练次数# 前向传播y_pred = model(x)loss = criterion(y_pred, y_true)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()if epoch % 100 == 0:print(f"Epoch: {epoch}, Loss: {loss.item()}")# 预测结果
print(f"预测结果:{model(torch.tensor([[4.0]])).item():.2f}")  # 应接近9.0

运行结果

Epoch: 0, Loss: 28.679777145385742
Epoch: 100, Loss: 6.986947536468506
Epoch: 200, Loss: 1.1998177766799927
Epoch: 300, Loss: 0.3503131866455078
Epoch: 400, Loss: 0.26410627365112305
Epoch: 500, Loss: 0.23391492664813995
Epoch: 600, Loss: 0.20561623573303223
Epoch: 700, Loss: 0.17805127799510956
Epoch: 800, Loss: 0.15187351405620575
Epoch: 900, Loss: 0.12759387493133545
预测结果:8.31

代码解析

1 库名讲解
import torch
import torch.nn as nn
import torch.optim as optim
  • import torch

PyTorch 的核心库

主要功能:

  • 张量(torch.Tensor)的创建与操作(类似 NumPy,但支持 GPU)

  • 自动求导(如 x.requires_grad=True, loss.backward()

  • 与 CUDA GPU 的交互(如 tensor.cuda()

  • 各种底层数学函数和操作(矩阵乘法、转置、广播等)

  • import torch.nn as nn

PyTorch 的 神经网络模块(neural network),简称 nn,是构建模型的主要工具箱


【它提供了什么?】

  • 所有层结构:如 nn.Linear, nn.Conv2d, nn.LSTM...

  • 激活函数:如 nn.ReLU(), nn.Sigmoid(), nn.Tanh()...

  • 损失函数:如 nn.MSELoss(), nn.CrossEntropyLoss()...

  • 网络容器:如 nn.Sequential, nn.ModuleList...

  • 自定义模型继承基类:nn.Module

常见用途示例

layer = nn.Linear(3, 1)          # 线性层
activation = nn.ReLU()          # 激活函数
loss_fn = nn.MSELoss()          # 损失函数
  • import torch.optim as optim

PyTorch 的 优化器模块(optimizer),简称 optim,用于更新模型参数


【它提供了什么?】

  • 各种优化算法:

    • optim.SGD(随机梯度下降)

    • optim.Adam(常用、高效)

    • optim.RMSpropoptim.Adagrad 等等

  • 每个优化器都负责调用 .step() 去更新参数

【常见用途示例】

optimizer = optim.Adam(model.parameters(), lr=0.01)  # 用Adam优化器训练模型

 🧠 总结表格

导入模块简称作用说明举例功能
import torchPyTorch 核心,张量与自动微分支持张量运算、GPU支持
import torch.nnnn模型构建相关,如层、损失、激活函数nn.Linear(), nn.ReLU()
import torch.optimoptim参数优化器(训练时更新参数)optim.Adam(), .step()

 


2 定义模型结构
# 定义一个简单的线性回归模型
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.fc = nn.Linear(1, 1)  # 输入1维,输出1维def forward(self, x):return self.fc(x)
  • class LinearRegression(nn.Module)

【LinearRegression】

定义了一个名叫 LinearRegression 的类。


【nn.Module】

它是继承自 nn.Module,这是 PyTorch 所有神经网络模型的基类,你自定义模型时必须继承它。

  • def __init__(self):

这是类的构造函数(初始化函数),你每次创建模型对象时都会自动调用这个函数。

  • super(LinearRegression, self).__init__()

【整体含义】

解析:调用 PyTorch 模型父类的初始化函数,保证模型能正常注册参数、追踪梯度、训练运行。

这样才能初始化模型的一些内部结构,比如参数注册表、计算图、等。

模型参数的注册功能

计算图的构建逻辑

.to().cuda().eval() 等方法


【super(...).__init__()】

LinearRegression :是自定义的类

super(...).__init__():调用它的父类的构造函数

PyTorch 模型的“开机自检”,你不写它,等于模型“没开机”。

换句话说:你写这个模型是“在 PyTorch 框架下造轮子”,必须先告诉 PyTorch“我在用你家的车架”,用这句 super() 就是这个意思。

  • self.fc = nn.Linear(1, 1)

【nn.Linear(1, 1)】

表示这是一个 线性层(也叫全连接层、全线性变换层):

  • 输入是 1 个特征值(即一维)

  • 输出是 1 个预测值(也是一维)

换句话说,这一层会自动帮你实现:

这就是线性回归公式 y=wx+b。

它做的事情是:

对输入数据进行线性变换


【Linear的语法】

格式:

layer = nn.Linear(in_features, out_features, bias=True)
参数名作用
in_features输入特征维度(输入有多少个数)
out_features输出特征维度(要输出多少个数)
bias是否使用偏置项(默认是 True

【self.fc】

这个线性层取的名字(随便取,比如 self.linear 也可以)


【常见的用法场景】

线性回归模型:

model = nn.Linear(1, 1)

神经网络中的隐藏层:

self.fc1 = nn.Linear(128, 64)  # 隐藏层从128维压缩到64维

输出层变换为分类概率:

self.out = nn.Linear(64, 10)   # 最终输出10类

【在训练中它能干嘛】

它会自动创建

  • 权重:W,形状为 (out_features, in_features)

  • 偏置:b,形状为 (out_features,)

这些参数会在你调用 .backward() 时参与梯度计算,并在 .step() 时更新。


【✅ 总结】

项目内容
函数nn.Linear(in_features, out_features)
本质实现:输出 = 输入 × 权重 + 偏置
作用模型中最基本的线性层,用于特征转换
参数自动训练并更新
常用场景线性回归、分类输出、隐藏层

  • 定义了一个神经网络模型,只有一层线性层(Linear)

  • nn.Linear(1, 1) 表示输入是一个数,输出也是一个数,本质就是学一个y=wx+b。


3 初始化模型、损失函数、优化器
model = LinearRegression()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
  • model: 创建线性模型。

  • criterion: 使用**均方误差(MSE)**作为损失函数,度量预测和真实值的差距。

  • optimizer: 使用 Adam 优化器 来更新模型的参数(权重和偏置)。

  • optimizer = optim.Adam(model.parameters(), lr=0.01)

创建一个 Adam 优化器,用来更新 model 模型中的所有可学习参数,学习率设为 0.01。


optimizer = optim.Adam(model.parameters(),  # 要优化的参数(通常是模型中的)lr=0.01              # 学习率(控制参数更新的幅度)
)

【optim.Adam(...)】

PyTorch 提供的一种优化器,来自 torch.optim 模块

作用:根据梯度 grad,自动更新模型中的参数 wb,让模型更接近目标输出。

比传统的 SGD 更智能,因为它有:

  • 自适应学习率

  • 动量机制

所以它通常收敛更快、效果更稳定。


【model.parameters()】

PyTorch 模型( nn.Module 写的那个)自带的一个函数

model.parameters() 会返回:

模型中所有**可训练的参数(权重和偏置)**的一个迭代器。

这些参数是 PyTorch 帮你注册的,比如你用了:

self.fc = nn.Linear(1, 1)

PyTorch 会自动记录下 fc.weightfc.bias,然后通过 model.parameters() 一次性把所有这些需要训练的参数交给优化器。

✅ 总结

代码含义
optim.Adam(...)创建 Adam 优化器
model.parameters()获取模型中所有需要训练的参数
lr=0.01设置学习率(控制参数更新的速度)

这句代码把优化器和模型参数绑定起来了,你在训练中每次调用:

loss.backward()   # 计算梯度
optimizer.step()  # 更新参数

 优化器就知道该更新谁、更新多少。


4 构造训练数据
x = torch.tensor([[1.0], [2.0], [3.0]])
y_true = torch.tensor([[3.0], [5.0], [7.0]])

训练的数据就是:

输入 x输出 y
13
25
37

【torch.tensor()】 

创建张量(PyTorch 的核心数据结构),是 PyTorch 中进行所有数值计算的基本单位。


 5 开始训练(重复 1000 次)
for epoch in range(1000):y_pred = model(x)          # 前向传播:预测输出loss = criterion(y_pred, y_true)  # 计算预测与真实之间的损失optimizer.zero_grad()      # 梯度清零loss.backward()            # 反向传播:计算梯度(链式法则起作用)optimizer.step()           # 更新权重参数
  • 每次循环就是一次“看数据 → 算误差 → 调整参数”的过程。

  • 每100次打印一次 loss,显示学习过程。


6 模型训练好之后进行预测
print(f"预测结果:{model(torch.tensor([[4.0]])).item():.2f}")

输入 x=4,如果模型学得好,输出应该接近 y=2×4+1=9。

🚀最终效果:

训练完成后,模型学会了通过 x预测 y,相当于找到了最优的权重 w 和偏置 b,满足:

 

http://www.xdnf.cn/news/1071217.html

相关文章:

  • 19、RocketMQ核⼼编程模型
  • AI助力基因数据分析:用Python玩转生命密码的秘密
  • 像素之外的智慧:Adobe AI在动态影像与云端协作中的进阶应用
  • LLM驱动开发:正在重塑软件工程的下一场革命
  • Re:从零开始的文件结构(融合线性表来理解 考研向)
  • 自动化保护 AWS ECS Fargate 服务:使用 Prisma Cloud 实现容器安全
  • uiautomation控制计算器,不动鼠标(界面控制)
  • Nuxt.js基础(配置)
  • 【Elasticsearch】Linux环境下安装Elasticsearch
  • 论特定领域软件架构
  • 《Opto-Electronic Advances》热点论文速览(2025)
  • 汽车涂胶车间的“通信桥梁”:PROFIBUS DP转ETHERNET/IP网关的应用实践
  • word中如何保存高清图片,并保存为高质量的pdf文件(图像不失真)
  • 多张图片生成PDF每张图片生成pdf的一页
  • lxd 容器内的深度学习服务器环境配置
  • sql server 将nvarchar长度设置成max有什么隐患
  • VSCode中创建和生成动态库项目
  • 时序数据库全面解析与对比
  • TCP/IP协议简要概述
  • 小型软件开发的三重境界:从混沌编码到结构化设计
  • Stable Diffusion入门-ControlNet 深入理解 第二课:ControlNet模型揭秘与使用技巧
  • 基于残差神经网络的垃圾分类
  • Maven生命周期与阶段扩展深度解析
  • 嵌入式项目:基于QT与Hi3861的物联网智能大棚集成控制系统
  • jenkins中执行python脚本导入路径错误
  • Chrome浏览器访问https提示“您的连接不是私密连接”问题解决方案
  • 【C++特殊工具与技术】固有的不可移植的特性(3)::extern“C“
  • 力扣第455场周赛
  • MATLAB 4D作图
  • Hyperledger Fabric 入门笔记(二十)Fabric V2.5 测试网络进阶之Tape性能测试