04-pytorch构建线性回归

1. 过程说明

在pytorch中进行模型构建的整个流程一般分为四个步骤:

  • 准备训练集数据

  • 构建要使用的模型

  • 设置损失函数和优化器

  • 模型训练

要使用的API:

  • 使用 PyTorch 的 nn.MSELoss() 代替平方损失函数

  • 使用 PyTorch 的 data.DataLoader 代替数据加载器

  • 使用 PyTorch 的 optim.SGD 代替优化器

  • 使用 PyTorch 的 nn.Linear 代替假设函数

2. 代码

python 复制代码
import torch
from torch.utils.data import TensorDataset  # 构造数据集对象
from torch.utils.data import DataLoader  # 数据加载器
from torch import nn  # nn模块中有平方损失函数和假设函数
from torch import optim  # optim模块中有优化器函数
from sklearn.datasets import make_regression  # 创建线性回归模型数据集
import matplotlib.pyplot as plt


plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


# 构造数据集
def create_dataset():
    x, y, coef = make_regression(n_samples=100,
                                 n_features=1,
                                 noise=10,
                                 coef=True,
                                 bias=14.5,
                                 random_state=0)

    # 将构建数据转换为张量类型
    x = torch.tensor(x)
    y = torch.tensor(y)

    return x, y, coef


# 训练模型
def train():
    # 构造数据集
    x, y, coef = create_dataset()

    # 构造数据集对象
    dataset = TensorDataset(x, y)

    # 构造数据加载器
    # dataset=:数据集对象
    # batch_size=:批量训练样本数据
    # shuffle=:样本数据是否进行乱序
    dataloader = DataLoader(dataset=dataset, batch_size=16, shuffle=True)

    # 构造模型
    # in_features指的是输入的二维张量的大小,即输入的[batch_size, size]中的size
    # out_features指的是输出的二维张量的大小,即输出的[batch_size,size]中的size
    model = nn.Linear(in_features=1, out_features=1)

    # 构造平方损失函数
    criterion = nn.MSELoss()

    # 构造优化函数
    # params=model.parameters():训练的参数,w和b
    # lr=1e-2:学习率, 1e-2为10的负二次方
    print("w和b-->", list(model.parameters()))
    print("w-->", model.weight)
    print("b-->", model.bias)
    optimizer = optim.SGD(params=model.parameters(), lr=1e-2)

    # 初始化训练次数
    epochs = 100
    # 损失的变化
    epoch_loss = [] 
    total_loss=0.0 
    train_sample=0.0
    for _ in range(epochs):
        for train_x, train_y in dataloader:
            # 将一个batch的训练数据送入模型
            y_pred = model(train_x.type(torch.float32))
            # 计算损失值,均方误差,当前批次所有样本的平均误差 
            loss = criterion(y_pred, train_y.reshape(-1, 1).type(torch.float32))
            total_loss += loss.item() 
            # loss是平均误差,所以样本数+1
            train_sample += 1
            # 梯度清零
            optimizer.zero_grad()
            # 自动微分(反向传播)
            loss.backward()
            # 更新参数
            optimizer.step()
        # 计算所有batch的平均误差作为当前epoch的误差 
        epoch_loss.append(total_loss/train_sample)
        
    # 打印回归模型的w
    print(model.weight)
    # 打印回归模型的b
    print(model.bias)
    
    # 绘制损失变化曲线 
    plt.plot(range(epochs), epoch_loss) 
    plt.title('损失变化曲线') 
    plt.grid() 
    plt.show()

    # 绘制拟合直线
    plt.scatter(x, y)
    x = torch.linspace(x.min(), x.max(), 1000)
    y1 = torch.tensor([v * model.weight + model.bias for v in x])
    y2 = torch.tensor([v * coef + 14.5 for v in x])
    plt.plot(x, y1, label='训练')
    plt.plot(x, y2, label='真实')
    plt.grid()
    plt.legend()
    plt.show()


if __name__ == '__main__':
    train()
相关推荐
海带紫菜菠萝汤2 分钟前
本周 AI 观察:算力、路由、账本——护城河正搬出模型层
人工智能·ai·程序员·架构·大模型
Wild API3 分钟前
蒸馏小模型:独立答题和给大模型打草稿,差在哪里?
人工智能·大模型·知识蒸馏
zt_vicky4 分钟前
策略产品视角下的机器学习与知识图谱:从业务需求到模型落地
人工智能·机器学习·知识图谱
AI码上来6 分钟前
我把“打电话“和“对讲机“做进了同一个页面
人工智能·实时音视频
镜象科技9 分钟前
职业院校AI心理健康解决方案是什么?从一台设备到全周期守护
android·人工智能
愤怒的代码11 分钟前
模型量化为什么几乎不损失精度:误差的四道防线
人工智能
YoLo♪15 分钟前
PicGo OpenHarmony PC 适配说明
人工智能·机器人·交互
Web3&Basketball16 分钟前
决策模型vs GPT-5实测:便宜400倍
人工智能·python·gpt·大模型·ai落地·推理优化·决策模型
zzu123zsw17 分钟前
从 Copilot 中间人切换到自主工程执行体:Block 开源 AI 研发智能体 Goose 的 Rust 微内核与 MCP 扩展实践
人工智能·开源·copilot
Mars-xq17 分钟前
家庭膳食营养速查表
大数据·人工智能