【机器学习深度学习】线性回归(基本模型训练流程)
目录
线性回归示例
执行过程
执行代码
运行结果
代码解析
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.RMSprop
,optim.Adagrad
等等每个优化器都负责调用
.step()
去更新参数【常见用途示例】
optimizer = optim.Adam(model.parameters(), lr=0.01) # 用Adam优化器训练模型
🧠 总结表格
导入模块 | 简称 | 作用说明 | 举例功能 |
---|---|---|---|
import torch | 无 | PyTorch 核心,张量与自动微分支持 | 张量运算、GPU支持 |
import torch.nn | nn | 模型构建相关,如层、损失、激活函数 | nn.Linear() , nn.ReLU() |
import torch.optim | optim | 参数优化器(训练时更新参数) | 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
,自动更新模型中的参数w
和b
,让模型更接近目标输出。比传统的 SGD 更智能,因为它有:
自适应学习率
动量机制
所以它通常收敛更快、效果更稳定。
【model.parameters()】
PyTorch 模型(
nn.Module
写的那个)自带的一个函数
model.parameters()
会返回:模型中所有**可训练的参数(权重和偏置)**的一个迭代器。
这些参数是 PyTorch 帮你注册的,比如你用了:
self.fc = nn.Linear(1, 1)
PyTorch 会自动记录下
fc.weight
和fc.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 |
---|---|
1 | 3 |
2 | 5 |
3 | 7 |
【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,满足: