Pytorch 03 线性回归实例

本文通过Pytorch展示了线性回归的实现,包括数据生成、模型训练和预测,详细介绍了训练过程中的权重和偏置更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import torch
from torch.nn import Linear, Module, MSELoss
from torch.optim import SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


# 定义一个线性函数,这里使用y=5x+7
x = np.linspace(0, 20, 500)
y = 5*x + 7
plt.plot(x, y)

# 生成一些随机的点,作为训练数据
x = np.random.rand(256)
noise = np.random.randn(256) / 4
y = x * 5 + 7 + noise
df = pd.DataFrame()
df['x'] = x
df['y'] = y

# 显示下生成数据
sns.lmplot(x='x', y='y', data=df)
plt.show()

# 随机生成了一些点,下面将使用PyTorch建立一个线性的模型来对其进行拟合,这就是所说的训练的过程
# 其中参数(1, 1)代表输入输出的特征(feature)数量都是1. Linear 模型的表达式是y=wx+b,其中w代表权重,b代表偏置
model = Linear(1, 1)

# 损失函数我们使用均方损失函数:MSELoss
criterion = MSELoss()

# 优化器选择最常见的优化方法SGD,就是每一次迭代计算 mini-batch 的梯度,然后对参数进行更新,学习率 0.01
optim = SGD(model.parameters(), lr=0.01)

# 训练3000次
epochs = 3000

# 准备训练数据: x_train, y_train 的形状是 (256, 1), 代表 mini-batch 大小为256, feature 为1. astype('float32') 是为了下一步可以直接转换为 torch.float.
x_train = x.reshape(-1, 1).astype('float32')
y_train = y.reshape(-1, 1).astype('float32')


# 开始训练
for i in range(epochs):
    # 整理输入和输出的数据,这里输入和输出一定要是torch的Tensor类型
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
    # 使用模型进行预测
    outputs = model(inputs)
    # 梯度置0,否则会累加
    optim.zero_grad()
    # 计算损失
    loss = criterion(outputs, labels)
    # 反向传播
    loss.backward()
    # 使用优化器默认方法优化
    optim.step()
    if (i%100==0):
        # 每 100次打印一下损失函数,看看效果
        print('epoch {}, loss {:1.4f}'.format(i, loss.data.item()))


# 训练完成后看训练的成果是多少.model.parameters()提取模型参数.w,b是需要训练的模型参数m期望的数据w=5,b=7
[w, b] = model.parameters()
print(w.item(), b.item())

# 可视化一下我们的模型
predicted = model.forward(torch.from_numpy(x_train)).data.numpy()
plt.plot(x_train, y_train, 'go', label = 'data', alpha = 0.3)
plt.plot(x_train, predicted, label = 'predicted', alpha = 1)
plt.legend()
plt.show()

从左到右分别对应生成原直线,随机生成的数据点,预测的直线

这是训练后的w、b的对应值:

 

### 如何使用 PyTorch 实现线性回归 #### 创建数据集 为了实现线性回归,首先需要创建一个合适的数据集。通常情况下,会生成一些带有噪声的合成数据用于测试模型的效果。 ```python import numpy as np import torch from torch.utils import data def synthetic_data(w, b, num_examples): """Generate y = Xw + b + noise.""" X = torch.normal(0, 1, (num_examples, len(w))) y = torch.matmul(X, w) + b y += torch.normal(0, 0.01, y.shape) return X, y.reshape((-1, 1)) true_w = torch.tensor([2, -3.4]) true_b = 4.2 features, labels = synthetic_data(true_w, true_b, 1000) ``` 此部分代码定义了一个函数 `synthetic_data` 来生成给定权重 `w` 和偏置 `b` 的线性关系数据,并加入了一定量的随机噪音[^4]。 #### 定义模型 接着定义线性回归模型本身。由于PyTorch内置了许多方便的功能,可以直接通过继承`nn.Module`类来简化这一过程: ```python import torch.nn as nn class LinearRegression(nn.Module): def __init__(self, input_dim): super().__init__() self.linear = nn.Linear(input_dim, 1) def forward(self, x): return self.linear(x) ``` 当对象实例被调用时,在底层调用了`__call__`方法,随后再调用`forward()`方法完成前向传播操作[^2]。 #### 初始化参数与损失函数 初始化模型参数并指定使用的损失函数。对于线性回归而言,均方误差(MSE Loss)是最常用的选择之一。 ```python model = LinearRegression(features.shape[-1]) loss_fn = nn.MSELoss() ``` #### 设置优化算法 选择合适的优化器来进行梯度下降更新。这里选择了SGD作为例子,当然也可以尝试其他类型的优化器如Adam等。 ```python learning_rate = 0.03 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) ``` #### 训练循环 最后编写训练循环,迭代地调整模型参数直到收敛为止。 ```python batch_size = 10 dataset = data.TensorDataset(features, labels) data_iter = data.DataLoader(dataset, batch_size=batch_size, shuffle=True) epochs = 3 for epoch in range(epochs): for X, y in data_iter: pred = model(X) loss = loss_fn(pred, y) optimizer.zero_grad() # 清除之前的梯度 loss.backward() # 反向传播计算当前梯度 optimizer.step() # 更新参数 with torch.no_grad(): train_l = loss_fn(model(features), labels) print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}') ``` 上述代码展示了完整的线性回归建模流程,包括但不限于数据准备、模型搭建、损失评估以及参数优化等方面的工作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值