pc网站同步手机网站,做网站的需求调研,怎么在手机上搭建网站,全国小微企业名录系列文章目录
01-PyTorch新手必看#xff1a;张量是什么#xff1f;5 分钟教你快速创建张量#xff01; 02-张量运算真简单#xff01;PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch#xff1f;张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器#xff1a;PyTor…系列文章目录
01-PyTorch新手必看张量是什么5 分钟教你快速创建张量 02-张量运算真简单PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器PyTorch 张量拼接与拆分实用技巧 05-深度学习从索引开始PyTorch 张量索引与切片最全解析 06-张量形状任意改PyTorch reshape、transpose 操作超详细教程 07-深入解读 PyTorch 张量运算6 大核心函数全面解析代码示例一步到位 08-自动微分到底有多强PyTorch 自动求导机制深度解析 09-从零手写线性回归模型PyTorch 实现深度学习入门教程 10-PyTorch 框架实现线性回归从数据预处理到模型训练全流程 文章目录 系列文章目录前言一、构建数据集1.1 示例代码1.2 示例输出 二、构建假设函数2.1 示例代码 三、损失函数3.1 示例代码 四、优化方法4.1 示例代码 五、训练函数5.1 示例代码5.2 绘制结果 六、调用训练函数6.1 示例输出 七、小结7.1 完整代码 前言
在机器学习的学习过程中我们接触过 线性回归 模型并使用过如 Scikit-learn 这样的工具来快速实现。但在本文中将深入理解线性回归的核心思想并使用 PyTorch 从零开始手动实现一个线性回归模型。这包括
数据集的构建假设函数的定义损失函数的设计梯度下降优化方法的实现模型训练和损失变化的可视化。 一、构建数据集
线性回归需要一个简单的线性数据集我们将通过sklearn.datasets.make_regression 方法生成。
1.1 示例代码
import torch
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt
import randomdef create_dataset():使用 make_regression 生成线性回归数据集并转换为 PyTorch 张量。x, y, coef make_regression(n_samples120, # 样本数量即数据点个数n_features1, # 每个样本只有一个特征noise15, # 添加噪声模拟真实场景coefTrue, # 是否返回生成数据的真实系数bias12.0, # 偏置值即 y coef * x biasrandom_state42 # 随机种子保证结果一致性)# 转换为 PyTorch 张量x torch.tensor(x, dtypetorch.float32) # 输入特征张量y torch.tensor(y, dtypetorch.float32).reshape(-1, 1) # 输出标签张量转换为二维return x, y, coef # 返回输入特征张量、输出标签张量和真实系数# 数据加载器用于批量获取数据
def data_loader(x, y, batch_size):数据加载器按批次随机提取训练数据。参数:x: 输入特征张量y: 输出标签张量batch_size: 批量大小data_len len(y) # 数据集长度indices list(range(data_len)) # 创建索引列表random.shuffle(indices) # 随机打乱索引保证数据随机性num_batches data_len // batch_size # 计算批次数for i in range(num_batches): # 遍历每个批次start i * batch_size # 当前批次起始索引end start batch_size # 当前批次结束索引# 提取当前批次的数据batch_x x[indices[start:end]] # 当前批次输入batch_y y[indices[start:end]] # 当前批次输出yield batch_x, batch_y # 返回当前批次数据1.2 示例输出
运行 create_dataset 后的数据分布为线性趋势同时包含噪声点。例如
x:
tensor([[-1.3282],[ 0.1941],[ 0.8944],...])
y:
tensor([-40.2345, 15.2934, 45.1282, ...])
coef:
tensor([35.0])二、构建假设函数
线性回归的假设函数可以表示为 y w ⋅ x b y ^ w⋅xb yw⋅xb 其中( w ) 是权重( b ) 是偏置。使用 PyTorch 张量定义这些参数。
2.1 示例代码
# 模型参数初始化
w torch.tensor(0.5, requires_gradTrue, dtypetorch.float32) # 权重
b torch.tensor(0.0, requires_gradTrue, dtypetorch.float32) # 偏置# 假设函数
def linear_regression(x):return w * x b三、损失函数
我们使用均方误差MSE作为损失函数其公式为 L 1 n ∑ i 1 n ( y ^ i − y i ) 2 L \frac{1}{n} \sum_{i1}^n (\hat{y}_i - y_i)^2 Ln1i1∑n(y^i−yi)2
3.1 示例代码
def square_loss(y_pred, y_true):return (y_pred - y_true) ** 2四、优化方法
为了更新模型参数 ( w ) 和 ( b )使用 随机梯度下降SGD 算法其更新公式为 w w − η ⋅ ∂ L ∂ w , b b − η ⋅ ∂ L ∂ b w w - \eta \cdot \frac{\partial L}{\partial w}, \quad b b - \eta \cdot \frac{\partial L}{\partial b} ww−η⋅∂w∂L,bb−η⋅∂b∂L 其中η 是学习率。
4.1 示例代码
def sgd(lr0.01, batch_size16):# 更新权重和偏置w.data w.data - lr * w.grad.data / batch_sizeb.data b.data - lr * b.grad.data / batch_size五、训练函数
将前面定义的所有组件组合在一起构建训练函数通过多个 epoch 来优化模型。
5.1 示例代码
# 模型训练函数
def train():训练线性回归模型。# 加载数据集x, y, coef create_dataset()# 设置训练参数epochs 50 # 训练轮次learning_rate 0.01 # 学习率batch_size 16 # 每批次的数据大小# 使用 PyTorch 内置优化器optimizer torch.optim.SGD([w, b], lrlearning_rate)epoch_loss [] # 用于记录每轮的平均损失for epoch in range(epochs): # 遍历每一轮total_loss 0.0 # 累计损失for batch_x, batch_y in data_loader(x, y, batch_size): # 遍历每个批次# 使用假设函数计算预测值y_pred linear_regression(batch_x)# 计算损失loss square_loss(y_pred, batch_y) # 当前批次的平均损失total_loss loss.item() # 累加总损失# 梯度清零optimizer.zero_grad()# 反向传播计算梯度loss.backward()# 使用随机梯度下降更新参数optimizer.step()# 记录当前轮次的平均损失epoch_loss.append(total_loss / len(y))print(f轮次 {epoch 1}, 平均损失: {epoch_loss[-1]:.4f}) # 打印损失# 可视化训练结果plot_results(x, y, coef, epoch_loss)5.2 绘制结果
# 可视化训练结果
def plot_results(x, y, coef, epoch_loss):绘制训练结果包括拟合直线和损失变化曲线。参数:x: 输入特征张量y: 输出标签张量coef: 数据生成时的真实权重epoch_loss: 每轮的平均损失# 绘制训练数据点和拟合直线plt.scatter(x.numpy(), y.numpy(), label数据点, alpha0.7) # 数据点x_line torch.linspace(x.min(), x.max(), 100).unsqueeze(1) # 连续 x 值y_pred linear_regression(x_line).detach().numpy() # 模型预测值coef_tensor torch.tensor(coef, dtypetorch.float32) # 将 coef 转换为 PyTorch 张量y_true coef_tensor * x_line 12.0 # 真实直线生成数据时的公式plt.plot(x_line.numpy(), y_pred, label拟合直线, colorred) # 拟合直线plt.plot(x_line.numpy(), y_true.numpy(), label真实直线, colorgreen) # 真实直线plt.legend()plt.grid()plt.title(线性回归拟合)plt.xlabel(特征值 X)plt.ylabel(标签值 Y)plt.show()# 绘制损失变化曲线plt.plot(range(len(epoch_loss)), epoch_loss)plt.title(损失变化曲线)plt.xlabel(轮次)plt.ylabel(损失)plt.grid()plt.show()六、调用训练函数
在主程序中调用 train 函数训练模型并观察输出。
if __name__ __main__:train()6.1 示例输出
拟合直线 损失变化曲线 七、小结
本文通过手动实现线性回归模型完成了以下内容
构建数据集并设计数据加载器定义线性假设函数设计均方误差损失函数实现随机梯度下降优化方法训练模型并可视化损失变化和拟合直线。
7.1 完整代码
import torch
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt
import random# 设置 Matplotlib 支持中文
plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签
plt.rcParams[axes.unicode_minus] False # 用来正常显示负号# 数据集生成函数
def create_dataset():使用 make_regression 生成线性回归数据集并转换为 PyTorch 张量。x, y, coef make_regression(n_samples120, # 样本数量即数据点个数n_features1, # 每个样本只有一个特征noise15, # 添加噪声模拟真实场景coefTrue, # 是否返回生成数据的真实系数bias12.0, # 偏置值即 y coef * x biasrandom_state42 # 随机种子保证结果一致性)# 转换为 PyTorch 张量x torch.tensor(x, dtypetorch.float32) # 输入特征张量y torch.tensor(y, dtypetorch.float32).reshape(-1, 1) # 输出标签张量转换为二维return x, y, coef # 返回输入特征张量、输出标签张量和真实系数# 数据加载器用于批量获取数据
def data_loader(x, y, batch_size):数据加载器按批次随机提取训练数据。参数:x: 输入特征张量y: 输出标签张量batch_size: 批量大小data_len len(y) # 数据集长度indices list(range(data_len)) # 创建索引列表random.shuffle(indices) # 随机打乱索引保证数据随机性num_batches data_len // batch_size # 计算批次数for i in range(num_batches): # 遍历每个批次start i * batch_size # 当前批次起始索引end start batch_size # 当前批次结束索引# 提取当前批次的数据batch_x x[indices[start:end]] # 当前批次输入batch_y y[indices[start:end]] # 当前批次输出yield batch_x, batch_y # 返回当前批次数据# 模型参数初始化
w torch.tensor(0.5, requires_gradTrue, dtypetorch.float32) # 权重初始值为 0.5
b torch.tensor(0.0, requires_gradTrue, dtypetorch.float32) # 偏置初始值为 0# 线性假设函数
def linear_regression(x):线性回归假设函数。参数:x: 输入特征张量返回:模型预测值return w * x b # 线性模型公式# 损失函数均方误差
def square_loss(y_pred, y_true):均方误差损失函数。参数:y_pred: 模型预测值y_true: 数据真实值返回:每个样本的平方误差return ((y_pred - y_true) ** 2).mean() # 返回均方误差# 模型训练函数
def train():训练线性回归模型。# 加载数据集x, y, coef create_dataset()# 设置训练参数epochs 50 # 训练轮次learning_rate 0.01 # 学习率batch_size 16 # 每批次的数据大小# 使用 PyTorch 内置优化器optimizer torch.optim.SGD([w, b], lrlearning_rate)epoch_loss [] # 用于记录每轮的平均损失for epoch in range(epochs): # 遍历每一轮total_loss 0.0 # 累计损失for batch_x, batch_y in data_loader(x, y, batch_size): # 遍历每个批次# 使用假设函数计算预测值y_pred linear_regression(batch_x)# 计算损失loss square_loss(y_pred, batch_y) # 当前批次的平均损失total_loss loss.item() # 累加总损失# 梯度清零optimizer.zero_grad()# 反向传播计算梯度loss.backward()# 使用随机梯度下降更新参数optimizer.step()# 记录当前轮次的平均损失epoch_loss.append(total_loss / len(y))print(f轮次 {epoch 1}, 平均损失: {epoch_loss[-1]:.4f}) # 打印损失# 可视化训练结果plot_results(x, y, coef, epoch_loss)# 可视化训练结果
def plot_results(x, y, coef, epoch_loss):绘制训练结果包括拟合直线和损失变化曲线。参数:x: 输入特征张量y: 输出标签张量coef: 数据生成时的真实权重epoch_loss: 每轮的平均损失# 绘制训练数据点和拟合直线plt.scatter(x.numpy(), y.numpy(), label数据点, alpha0.7) # 数据点x_line torch.linspace(x.min(), x.max(), 100).unsqueeze(1) # 连续 x 值y_pred linear_regression(x_line).detach().numpy() # 模型预测值coef_tensor torch.tensor(coef, dtypetorch.float32) # 将 coef 转换为 PyTorch 张量y_true coef_tensor * x_line 12.0 # 真实直线生成数据时的公式plt.plot(x_line.numpy(), y_pred, label拟合直线, colorred) # 拟合直线plt.plot(x_line.numpy(), y_true.numpy(), label真实直线, colorgreen) # 真实直线plt.legend()plt.grid()plt.title(线性回归拟合)plt.xlabel(特征值 X)plt.ylabel(标签值 Y)plt.show()# 绘制损失变化曲线plt.plot(range(len(epoch_loss)), epoch_loss)plt.title(损失变化曲线)plt.xlabel(轮次)plt.ylabel(损失)plt.grid()plt.show()# 调用训练函数
if __name__ __main__:train()