PyTorch零基础入门之逻辑斯蒂回归

PyTorch零基础入门之逻辑斯蒂回归

本文将介绍如何使用PyTorch实现逻辑斯蒂回归模型。逻辑斯蒂回归是一种二元分类模型,它可以用于预测一个样本属于两个类别中的哪一个。

1. 数据集

我们将使用Iris数据集进行逻辑斯蒂回归模型的训练和测试。该数据集包含150个样本,每个样本包含4个特征和1个标签。我们将使用前100个样本作为训练集,后50个样本作为测试集。

import pandas as pd
import numpy as np

# 加载数据集
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = pd.read_csv(url, names=names)

# 将标签转换为0和1
dataset['class'] = np.where(dataset['class'] == 'Iris-setosa', 0, 1)

# 将数据集分为训练集和测试集
train_dataset = dataset[:100]
test_dataset = dataset[100:]

2. 模型搭建

我们将使用PyTorch搭建一个简单的逻辑斯蒂回归模型。该模型包含一个线性层和一个sigmoid激活函数。

import torch.nn as nn

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

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

model = LogisticRegression()

3. 模型训练

我们将使用二元交叉熵损失函数和随机梯度下降(SGD)优化器进行模型训练。我们将模型训练100个epoch,并在每个epoch结束时计算训练集和测试集的准确率。

import torch.optim as optim

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

# 训练模型
for epoch in range(100):
    # 在训练集上训练模型
    train_correct = 0
    train_total = 0
    for index, row in train_dataset.iterrows():
        optimizer.zero_grad()
        inputs = torch.tensor(row[:4].values, dtype=torch.float32)
        label = torch.tensor(row[4], dtype=torch.float32)
        outputs = model(inputs)
        loss = criterion(outputs, label.unsqueeze(0))
        loss.backward()
        optimizer.step()
        predicted = torch.round(outputs)
        train_total += 1
        train_correct += (predicted == label).sum().item()

    # 在测试集上测试模型
    test_correct = 0
    test_total = 0
    with torch.no_grad():
        for index, row in test_dataset.iterrows():
            inputs = torch.tensor(row[:4].values, dtype=torch.float32)
            label = torch.tensor(row[4], dtype=torch.float32)
            outputs = model(inputs)
            predicted = torch.round(outputs)
            test_total += 1
            test_correct += (predicted == label).sum().item()

    # 打印准确率
    print(f'Epoch {epoch+1}, Train Accuracy: {train_correct/train_total}, Test Accuracy: {test_correct/test_total}')

4. 模型预测

我们使用训练好的模型来预测测试集中的样本,并将预测结果与实际结果进行比较。

# 预测测试集中的样本
with torch.no_grad():
    inputs = torch.tensor(test_dataset.iloc[0,:4].values, dtype=torch.float32)
    label = torch.tensor(test_dataset.iloc[0,4], dtype=torch.float32)
    outputs = model(inputs)
    predicted = torch.round(outputs).item()

# 打印预测结果和实际结果
print(f'Actual: {label}, Predicted: {predicted}')

示例2:使用GPU加速的逻辑斯蒂回归模型

如果你的机器上有GPU,你可以使用PyTorch的GPU加速功能来加速模型训练和预测。以下是使用GPU加速的逻辑斯蒂回归模型的示例代码。

import torch.nn as nn

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

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

model = LogisticRegression().cuda()

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

# 训练模型
for epoch in range(100):
    # 在训练集上训练模型
    train_correct = 0
    train_total = 0
    for index, row in train_dataset.iterrows():
        optimizer.zero_grad()
        inputs = torch.tensor(row[:4].values, dtype=torch.float32).cuda()
        label = torch.tensor(row[4], dtype=torch.float32).cuda()
        outputs = model(inputs)
        loss = criterion(outputs, label.unsqueeze(0))
        loss.backward()
        optimizer.step()
        predicted = torch.round(outputs)
        train_total += 1
        train_correct += (predicted == label).sum().item()

    # 在测试集上测试模型
    test_correct = 0
    test_total = 0
    with torch.no_grad():
        for index, row in test_dataset.iterrows():
            inputs = torch.tensor(row[:4].values, dtype=torch.float32).cuda()
            label = torch.tensor(row[4], dtype=torch.float32).cuda()
            outputs = model(inputs)
            predicted = torch.round(outputs)
            test_total += 1
            test_correct += (predicted == label).sum().item()

    # 打印准确率
    print(f'Epoch {epoch+1}, Train Accuracy: {train_correct/train_total}, Test Accuracy: {test_correct/test_total}')

# 预测测试集中的样本
with torch.no_grad():
    inputs = torch.tensor(test_dataset.iloc[0,:4].values, dtype=torch.float32).cuda()
    label = torch.tensor(test_dataset.iloc[0,4], dtype=torch.float32).cuda()
    outputs = model(inputs)
    predicted = torch.round(outputs).item()

# 打印预测结果和实际结果
print(f'Actual: {label}, Predicted: {predicted}')

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch零基础入门之逻辑斯蒂回归 - Python技术站

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

相关文章

  • 解决PyTorch与CUDA版本不匹配的问题

    在使用PyTorch时,如果您的CUDA版本与PyTorch版本不匹配,可能会遇到一些问题。以下是两个示例说明,介绍如何解决PyTorch与CUDA版本不匹配的问题。 示例1:使用conda安装PyTorch 如果您使用conda安装PyTorch,可以使用以下命令来安装特定版本的PyTorch: conda install pytorch==1.8.0 t…

    PyTorch 2023年5月16日
    00
  • Multiplication in PyTorch

    1. Element-wise Multiplication * torch.Tensor.mul() torch.mul()   2. Matrix Multiplication torch.Tensor.matmul() torch.matmul() torch.Tensor.mm() torch.mm()   3. Batch Matrix Multi…

    PyTorch 2023年4月8日
    00
  • 深度学习训练过程中的学习率衰减策略及pytorch实现

    学习率是深度学习中的一个重要超参数,选择合适的学习率能够帮助模型更好地收敛。 本文主要介绍深度学习训练过程中的6种学习率衰减策略以及相应的Pytorch实现。 1. StepLR 按固定的训练epoch数进行学习率衰减。 举例说明: # lr = 0.05 if epoch < 30 # lr = 0.005 if 30 <= epoch &lt…

    2023年4月8日
    00
  • 在pytorch中计算准确率,召回率和F1值的操作

    在PyTorch中,我们可以使用混淆矩阵来计算准确率、召回率和F1值。混淆矩阵是一个二维矩阵,用于比较模型的预测结果和真实标签。下面是一个简单的示例,演示如何使用混淆矩阵计算准确率、召回率和F1值。 示例一:二分类问题 在二分类问题中,混淆矩阵包含四个元素:真正例(True Positive,TP)、假正例(False Positive,FP)、真反例(Tr…

    PyTorch 2023年5月15日
    00
  • Pytorch实现List Tensor转Tensor,reshape拼接等操作

    以下是PyTorch实现List Tensor转Tensor、reshape、拼接等操作的两个示例说明。 示例1:将List Tensor转换为Tensor 在这个示例中,我们将使用PyTorch将List Tensor转换为Tensor。 首先,我们需要准备数据。我们将使用以下代码来生成List Tensor: import torch x1 = torc…

    PyTorch 2023年5月15日
    00
  • pytorch 数据加载性能对比分析

    PyTorch是一个流行的深度学习框架,它提供了许多用于加载和处理数据的工具。在本文中,我们将比较PyTorch中不同数据加载方法的性能,并提供一些示例说明。 数据加载方法 在PyTorch中,我们可以使用以下数据加载方法: torch.utils.data.DataLoader:这是PyTorch中最常用的数据加载方法。它可以从内存或磁盘中加载数据,并支持…

    PyTorch 2023年5月15日
    00
  • pytorch, retain_grad查看非叶子张量的梯度

    在用pytorch搭建和训练神经网络时,有时为了查看非叶子张量的梯度,比如网络权重张量的梯度,会用到retain_grad()函数。但是几次实验下来,发现用或不用retain_grad()函数,最终神经网络的准确率会有一点点差异。用retain_grad()函数的训练结果会差一些。目前还没有去探究这里面的原因。 所以,建议是,调试神经网络时,可以用retai…

    PyTorch 2023年4月7日
    00
  • [pytorch] PyTorch Hook

      为什么要引入hook? -> hook可以做什么? 都有哪些hook? 如何使用hook?   ¶ 参考:Pytorch中autograd以及hook函数详解在pytorch中的自动求梯度机制(Autograd mechanics)中,如果将tensor的requires_grad设为True, 那么涉及到它的一系列运算将在反向传播中自动求梯度。 …

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部