使用 PaddlePaddle 实现逻辑回归:从训练到模型保存与加载

在机器学习中,逻辑回归是一种经典的分类算法,广泛应用于二分类问题。今天,我们将通过一个简单的例子,使用 PaddlePaddle 框架实现逻辑回归模型,并展示如何保存和加载模型,以便进行后续的预测。

1. 简介

逻辑回归是一种线性分类模型,通过学习输入特征与输出标签之间的关系,实现对新数据的分类。PaddlePaddle 是一个开源的深度学习框架,提供了丰富的接口和工具,方便开发者快速实现和部署机器学习模型。

2. 数据准备

为了演示逻辑回归,我们生成了两组二维数据点,分别表示两个不同的类别。以下是数据的定义:

python 复制代码
class1_points = np.array([[1.9, 1.2],
                          [1.5, 2.1],
                          [1.9, 0.5],
                          [1.5, 0.9],
                          [0.9, 1.2],
                          [1.1, 1.7],
                          [1.4, 1.1]])

class2_points = np.array([[3.2, 3.2],
                          [3.7, 2.9],
                          [3.2, 2.6],
                          [1.7, 3.3],
                          [3.4, 2.6],
                          [4.1, 2.3],
                          [3.0, 2.9]])

我们将这两组数据合并,并为它们分配标签(0 和 1),表示不同的类别。然后,将数据转换为 Paddle 的 Tensor 格式,以便用于模型训练。

3. 模型定义

逻辑回归模型的核心是一个线性层,后面接一个 Sigmoid 激活函数。Sigmoid 函数将输出值映射到 (0, 1) 区间,表示属于某个类别的概率。以下是模型的定义:

python 复制代码
class LogisticRegression(nn.Layer):
    def __init__(self):
        super(LogisticRegression, self).__init__()
        self.linear = nn.Linear(2, 1)  # 输入特征维度为2,输出为1

    def forward(self, x):
        return nn.functional.sigmoid(self.linear(x))

4. 训练模型

为了训练模型,我们需要定义优化器和损失函数。这里我们使用随机梯度下降(SGD)优化器和二元交叉熵损失函数(BCELoss)。训练过程如下:

python 复制代码
optimizer = optim.SGD(parameters=model.parameters(), learning_rate=0.1)
loss_fn = nn.BCELoss()

epochs = 1000
for epoch in range(epochs):
    y_pred = model(X)
    loss = loss_fn(y_pred, y)
    loss.backward()
    optimizer.step()
    optimizer.clear_grad()
    if epoch % 100 == 0:
        print(f"Epoch {epoch}, Loss: {loss.numpy()}")

在训练过程中,我们每 100 个 epoch 打印一次损失值,以便观察模型的收敛情况。

5. 保存模型

训练完成后,我们需要将模型的参数保存到文件中,以便后续加载和使用。PaddlePaddle 提供了 paddle.save 方法,可以方便地保存模型参数:

python 复制代码
paddle.save(model.state_dict(), 'model2.pdparams')

6. 加载模型

在需要使用模型进行预测时,我们可以通过 paddle.load 方法加载保存的模型参数,并将其加载到模型中:

python 复制代码
model_state_dict = paddle.load('model2.pdparams')
model.load_dict(model_state_dict)

7. 预测新数据

加载模型后,我们可以对新的数据点进行预测。以下是预测新数据的代码:

python 复制代码
new_data = paddle.to_tensor([[2.0, 2.0], [3.5, 3.0]], dtype='float32')
predictions = model(new_data)
print("Predictions:", predictions.numpy())

预测结果是一个概率值,表示数据点属于类别 1 的概率。

8. 完整代码

以下是完整的代码实现:

python 复制代码
import paddle
import paddle.nn as nn
import paddle.optimizer as optim
import numpy as np


"""使用paddlepaddle框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测"""
# 数据准备
class1_points = np.array([[1.9, 1.2],
                          [1.5, 2.1],
                          [1.9, 0.5],
                          [1.5, 0.9],
                          [0.9, 1.2],
                          [1.1, 1.7],
                          [1.4, 1.1]])

class2_points = np.array([[3.2, 3.2],
                          [3.7, 2.9],
                          [3.2, 2.6],
                          [1.7, 3.3],
                          [3.4, 2.6],
                          [4.1, 2.3],
                          [3.0, 2.9]])

# 将数据合并为一个数据集
X = np.vstack((class1_points, class2_points))
y = np.hstack((np.zeros(len(class1_points)), np.ones(len(class2_points))))

# 转换为 Paddle 的 Tensor
X = paddle.to_tensor(X, dtype='float32')
y = paddle.to_tensor(y, dtype='float32').reshape([-1, 1])

# 定义逻辑回归模型
class LogisticRegression(nn.Layer):
    def __init__(self):
        super(LogisticRegression, self).__init__()
        self.linear = nn.Linear(2, 1)  # 输入特征维度为2,输出为1

    def forward(self, x):
        return nn.functional.sigmoid(self.linear(x))

# 实例化模型、优化器和损失函数
model = LogisticRegression()
optimizer = optim.SGD(parameters=model.parameters(), learning_rate=0.1)
loss_fn = nn.BCELoss()

# 训练模型1000次,每100次展示一下loss
epochs = 1000
for epoch in range(epochs):
    y_pred = model(X)
    loss = loss_fn(y_pred, y)
    loss.backward()
    optimizer.step()
    optimizer.clear_grad()
    if epoch % 100 == 0:
        print(f"Epoch {epoch}, Loss: {loss.numpy()}")

# 保存模型
paddle.save(model.state_dict(), 'model2.pdparams')

# 加载模型
model_state_dict = paddle.load('model2.pdparams')
model.load_dict(model_state_dict)

# 预测新数据
new_data = paddle.to_tensor([[2.0, 2.0], [3.5, 3.0]], dtype='float32')
predictions = model(new_data)
print("Predictions:", predictions.numpy())
相关推荐
小鸡吃米…12 小时前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫12 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)12 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
minhuan12 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维12 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS12 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd13 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
水如烟13 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能
Carl_奕然14 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析
旅途中的宽~14 小时前
《European Radiology》:2024血管瘤分割—基于MRI T1序列的分割算法
人工智能·计算机视觉·mri·sci一区top·血管瘤·t1