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

yizhihongxing

下面是使用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日

相关文章

  • Spring Cloud Ribbon实现客户端负载均衡的示例

    下面是“Spring Cloud Ribbon实现客户端负载均衡的示例”的完整攻略。 一、什么是Spring Cloud Ribbon Spring Cloud Ribbon是Netflix Ribbon的一个集成,通过使用Spring Cloud的注解和Spring Cloud的默认配置,可以方便地实现客户端负载均衡。 二、Spring Cloud Rib…

    人工智能概览 2023年5月25日
    00
  • 教你搭建dns服务器(图文教程)

    这里为大家详细讲解如何搭建DNS服务器的完整攻略。 什么是DNS服务器 DNS服务器(Domain Name System Server)是一种Internet上的分布式数据库,用于将域名转换为IP地址。它负责将输入的域名查询信息转换为对应的IP地址,让用户能够通过域名访问网站、发送邮件等。 搭建DNS服务器的步骤 步骤一:购买域名和VPS 首先,需要购买一…

    人工智能概览 2023年5月25日
    00
  • pytorch 6 batch_train 批训练操作

    下面是关于pytorch 6 batch_train 批训练的完整攻略。 什么是批训练操作 在深度学习中,一般将训练数据分成一个个的batch,每个batch都可以看做是一个小的数据集。在批训练操作中,模型将对每个batch进行一次前向传播和反向传播,在更新梯度的过程中,使用所有batch的梯度的平均值。这样可以有效地加速训练进程,减小了内存占用和梯度更新的…

    人工智能概论 2023年5月25日
    00
  • Web安全之XSS攻击与防御小结

    以下是”Web安全之XSS攻击与防御小结”的完整攻略。 XSS攻击 XSS定义 XSS(Cross Site Scripting)攻击是指攻击者想办法把恶意代码植入到用户的网页上,当用户浏览该网页或在与该网页互动时,恶意代码将在用户的浏览器上执行,达到攻击的目的。 XSS攻击形式 反射型XSS:攻击者把放入XSS攻击代码的链接发送给用户,用户使用该链接访问网…

    人工智能概论 2023年5月24日
    00
  • nodejs教程之环境安装及运行

    下面是关于“nodejs教程之环境安装及运行”的完整攻略。 环境安装 下载安装包 首先,在官网(https://nodejs.org/)上下载相应版本的安装包。 Windows系统 下载后,双击安装包进行安装。根据安装程序中的指示,一步步进行安装即可。 Linux系统 对于Linux系统,可以通过包管理器进行安装。 Ubuntu/Debian 对于Ubunt…

    人工智能概论 2023年5月25日
    00
  • 在PyCharm搭建OpenCV-python的环境的详细过程

    搭建OpenCV-python环境的过程如下: 步骤一:下载安装PyCharm 首先需要下载安装PyCharm,可以到PyCharm官网下载对应版本的PyCharm进行安装。 步骤二:创建Python项目 在PyCharm中创建一个Python项目,选择机器上已安装的Python版本,然后创建一个py文件。 步骤三:安装OpenCV-python 打开终端或…

    人工智能概论 2023年5月25日
    00
  • CentOS 6.5下安装Python 3.5.2(与Python2并存)

    下面是详细的攻略。 准备工作 由于我们需要安装Python3.5.2,所以我们需要先下载Python3.5.2的源文件。可以在Python官网(https://www.python.org/downloads/release/python-352/) 下载到Python3.5.2的源文件,并将其保存在CentOS服务器的某个目录下,例如/home/pytho…

    人工智能概览 2023年5月25日
    00
  • Django url 路由匹配过程详解

    当一个用户请求一个URL时,Django会使用一个叫做URLconf的机制来决定如何处理这个请求。URLconf是一系列模式与响应函数之间的映射。当Django收到一个请求后,它会从URLconf的最上层开始,依次尝试匹配每个url pattern,直到找到一个符合请求的pattern为止。当一个match被找到后,Django就会调用与这个pattern相…

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