pytorch使用nn.Moudle实现逻辑回归

下面是使用PyTorch的nn.Module实现逻辑回归的完整攻略。

1. 准备数据

首先,我们需要准备要使用的数据集。假设我们使用的是一个二分类的问题,数据集中包含两种样本,每个样本有两个特征。我们可以通过以下代码生成一个包含100个样本的数据集:

import torch
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_features=2, n_redundant=0, n_informative=1,
                           n_clusters_per_class=1, n_samples=100)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 将数据转换为 PyTorch Tensor
X_train = torch.from_numpy(X_train).float()
X_test = torch.from_numpy(X_test).float()
y_train = torch.from_numpy(y_train).float()
y_test = torch.from_numpy(y_test).float()

2. 创建模型

创建一个模型需要继承 PyTorch 的 nn.Module 类并实现 __init__forward 方法。在 __init__ 中定义所有需要学习的参数,并在 forward 中实现模型的前向传递。下面是逻辑回归模型的代码实现:

import torch.nn as nn

class LogisticRegression(nn.Module):
    def __init__(self, input_size):
        super(LogisticRegression, self).__init__()
        self.linear = nn.Linear(input_size, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        out = self.linear(x)
        out = self.sigmoid(out)
        return out

__init__ 中定义了一个线性层(nn.Linear)和一个 Sigmoid 函数,forward 方法将输入传递给线性层,将结果传递给 Sigmoid 函数,并返回输出。这个模型仅有一个线性层和一个激活函数的结构,经过 Sigmoid 函数的特征值将被映射到[0,1]之间,可以看做是概率值。

3. 定义损失函数和优化器

在训练模型之前,我们需要定义一个损失函数和一个优化器。逻辑回归问题通常使用二元交叉熵作为损失函数,优化器可以选择随机梯度下降(SGD)或 Adam 优化器。下面是代码实现:

criterion = nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

在上面的代码中,我们使用了二元交叉熵作为损失函数,使用了随机梯度下降作为优化器。

4. 训练模型

有了前面的准备工作,我们就可以开始训练模型了。下面是训练模型的代码实现:

num_epochs = 1000

for epoch in range(num_epochs):
    # 向前传递batch数据
    outputs = model(X_train)
    loss = criterion(outputs, y_train)
    # 向后传递并更新权重
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, loss.item()))

在这段代码中,我们迭代 num_epochs 次,每次向前传递输入 X_train,计算损失,并向后传递并更新权重。最终输出了每轮训练的损失值。

5. 模型评估

在完成训练之后,我们需要对模型进行评估,看看它在测试集上的表现。下面是对模型进行评估的代码实现:

with torch.no_grad():
    # 计算模型在测试集上的预测值
    y_pred = model(X_test)
    # 将预测值进行四舍五入,得到最终的分类结果 
    y_pred = torch.round(y_pred)
    # 计算模型在测试集上的准确率
    accuracy = (y_pred == y_test).sum().item() / y_test.size(0)
    print('Accuracy of the model on the test set: {:.2f}%'.format(accuracy * 100))

在这段代码中,我们使用 torch.no_grad() 来避免在模型评估时计算梯度,计算测试集上的预测结果并将其四舍五入以获得最终的分类结果,然后计算模型在测试集上的准确率。

示例说明

下面是两个示例说明,展示如何使用上述攻略中的模型。

示例1: 基本应用

# 准备数据
import torch
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_features=2, n_redundant=0, n_informative=1,
                           n_clusters_per_class=1, n_samples=100)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 将数据转换为 PyTorch Tensor
X_train = torch.from_numpy(X_train).float()
X_test = torch.from_numpy(X_test).float()
y_train = torch.from_numpy(y_train).float()
y_test = torch.from_numpy(y_test).float()

# 创建模型
import torch.nn as nn

class LogisticRegression(nn.Module):
    def __init__(self, input_size):
        super(LogisticRegression, self).__init__()
        self.linear = nn.Linear(input_size, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        out = self.linear(x)
        out = self.sigmoid(out)
        return out

model = LogisticRegression(2)

# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 训练模型
num_epochs = 1000

for epoch in range(num_epochs):
    # 向前传递batch数据
    outputs = model(X_train)
    loss = criterion(outputs, y_train)
    # 向后传递并更新权重
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, loss.item()))

# 模型评估
with torch.no_grad():
    # 计算模型在测试集上的预测值
    y_pred = model(X_test)
    # 将预测值进行四舍五入,得到最终的分类结果 
    y_pred = torch.round(y_pred)
    # 计算模型在测试集上的准确率
    accuracy = (y_pred == y_test).sum().item() / y_test.size(0)
    print('Accuracy of the model on the test set: {:.2f}%'.format(accuracy * 100))

示例2: 对比不同优化器

# 准备数据
import torch
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_features=2, n_redundant=0, n_informative=1,
                           n_clusters_per_class=1, n_samples=100)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 将数据转换为 PyTorch Tensor
X_train = torch.from_numpy(X_train).float()
X_test = torch.from_numpy(X_test).float()
y_train = torch.from_numpy(y_train).float()
y_test = torch.from_numpy(y_test).float()

# 创建模型
import torch.nn as nn

class LogisticRegression(nn.Module):
    def __init__(self, input_size):
        super(LogisticRegression, self).__init__()
        self.linear = nn.Linear(input_size, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        out = self.linear(x)
        out = self.sigmoid(out)
        return out

model = LogisticRegression(2)

# 定义损失函数和优化器
criterion = nn.BCELoss()
sgd_optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
adam_optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# 使用 SGD 优化器训练模型
print("Using SGD optimizer:")
num_epochs = 1000

for epoch in range(num_epochs):
    # 向前传递batch数据
    outputs = model(X_train)
    loss = criterion(outputs, y_train)
    # 向后传递并更新权重
    sgd_optimizer.zero_grad()
    loss.backward()
    sgd_optimizer.step()

    if (epoch + 1) % 100 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, loss.item()))

# 模型评估
with torch.no_grad():
    # 计算模型在测试集上的预测值
    y_pred = model(X_test)
    # 将预测值进行四舍五入,得到最终的分类结果 
    y_pred = torch.round(y_pred)
    # 计算模型在测试集上的准确率
    accuracy = (y_pred == y_test).sum().item() / y_test.size(0)
    print('Accuracy of the model on the test set: {:.2f}%'.format(accuracy * 100))

# 使用 Adam 优化器训练模型
print("Using Adam optimizer:")
num_epochs = 1000

for epoch in range(num_epochs):
    # 向前传递batch数据
    outputs = model(X_train)
    loss = criterion(outputs, y_train)
    # 向后传递并更新权重
    adam_optimizer.zero_grad()
    loss.backward()
    adam_optimizer.step()

    if (epoch + 1) % 100 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, loss.item()))

# 模型评估
with torch.no_grad():
    # 计算模型在测试集上的预测值
    y_pred = model(X_test)
    # 将预测值进行四舍五入,得到最终的分类结果 
    y_pred = torch.round(y_pred)
    # 计算模型在测试集上的准确率
    accuracy = (y_pred == y_test).sum().item() / y_test.size(0)
    print('Accuracy of the model on the test set: {:.2f}%'.format(accuracy * 100))

在这个示例中,我们训练了两个模型,一个使用 SGD 优化器,另一个使用 Adam 优化器,然后比较了它们的性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch使用nn.Moudle实现逻辑回归 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Python pytesseract验证码识别库用法解析

    Python pytesseract验证码识别库用法解析 验证码识别是一个比较常见的需求,在Python中可以使用pytesseract库来进行验证码识别。本文详细讲解了pytesseract库的使用方法。 安装pytesseract库 在进行验证码识别前,需要先安装pytesseract库。在Python中,可以使用pip命令进行安装。在命令行中输入以下命…

    人工智能概论 2023年5月25日
    00
  • 获取Django项目的全部url方法详解

    下面我将详细讲解”获取Django项目的全部url方法详解”。 前言 在工作中我们经常需要获取Django项目的所有url链接,不仅仅是我们自己定义的url链接,还包括Django内部自带的url链接。这个需求,在做网站地图,爬虫等一些特定的业务逻辑开发中非常常见,本文就是要解决如何获取Django项目的所有url。 获取方式 获取Django项目的所有ur…

    人工智能概论 2023年5月25日
    00
  • python 获取谷歌浏览器保存的密码

    获取谷歌浏览器保存的密码,可以通过两种方式来实现,分别是使用Python标准库和第三方库。 使用Python标准库 Python标准库中的keyring模块提供了一种安全的方法来获取本地存储的密码,下面是获取谷歌浏览器保存的密码的完整步骤: 安装keyring模块。在终端中输入以下命令安装: bash pip install keyring 导入keyrin…

    人工智能概论 2023年5月25日
    00
  • 谈谈Redis分布式锁的正确实现方法

    谈谈Redis分布式锁的正确实现方法 在分布式系统中,为了避免因为多个线程同时对同一个资源进行写操作而出现的数据竞争问题,我们需要对关键代码段进行加锁,以保证在同一时间内只有一个线程对资源进行写操作。Redis作为一种高性能、高可用、可扩展的非关系型数据库,其分布式锁的实现也备受关注。 Redis分布式锁的基本原理 Redis分布式锁的基本原理是:当多个客户…

    人工智能概览 2023年5月25日
    00
  • java实现百度云文字识别接口代码

    简介 百度云文字识别接口是一款强大的OCR文字识别服务,可以帮助开发者快速识别各种场景下的文字,例如照片中的文字、屏幕截图中的文字、PDF文档中的文字等。其中,在Java应用程序中使用百度云文字识别服务,并不需要太多的开发经验,只需要使用百度云文字识别API和Java SDK即可。 下面,我们将详细说明如何使用Java代码实现百度云文字识别接口。 步骤 步骤…

    人工智能概论 2023年5月25日
    00
  • Nginx源码研究之nginx限流模块详解

    首先,需要明确Nginx限流模块的概念,即通过对请求的流量进行控制和限制,保护服务端资源免受过载而导致的服务不可用或响应缓慢。下面是nginx限流模块的完整攻略。 1. 理解Nginx限流模块的工作原理 Nginx限流模块的工作原理是基于Token Bucket算法,该算法与令牌桶算法类似,主要由三个核心参数组成:令牌速率,桶容量和最大可用令牌数。其中,令牌…

    人工智能概览 2023年5月25日
    00
  • 使用python opencv对畸变图像进行矫正的实现

    下面是使用Python OpenCV对畸变图像进行矫正的完整攻略: 一、什么是畸变 畸变是摄像机镜头导致图像失真的问题,通常由于透镜形状或者镜头的位置所引起,会对相机成像造成严重的影响。因此,对于需要精确测量的摄像机,畸变矫正是必不可少的。 二、如何进行畸变矫正 OpenCV提供了内置函数cv2.undistort()用于对图像进行畸变矫正。在进行畸变矫正之…

    人工智能概论 2023年5月24日
    00
  • 易语言修改指定网页为浏览器主页的代码

    以下是详细讲解“易语言修改指定网页为浏览器主页的代码”的完整攻略。 1. 确认浏览器主页的配置文件路径 首先,我们需要确认浏览器主页的配置文件路径。以Chrome为例,Windows系统下Chrome的主页配置文件存放在C:\Users\{user}\AppData\Local\Google\Chrome\User Data\Default\Preferen…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部