pytorch 鸢尾花分类


前言

pytorch 鸢尾花分类


一、鸢尾花数据集介绍

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

鸢尾花数据集(Iris dataset)是统计学和机器学习领域中常用的数据集之一,由英国统计学家和生物学家Ronald A. Fisher于1936年首次引入。这个数据集包含了三个不同种类的鸢尾花的测量数据,每个类别有50个样本,总共包含150个样本。
这三个鸢尾花的种类是:

山鸢尾(Iris setosa): 这种鸢尾花通常较小,花瓣较短,花朵颜色鲜艳,常见于北美。

变色鸢尾(Iris versicolor): 这种鸢尾花的花瓣和花萼都较长,颜色较为丰富。

维吉尼亚鸢尾(Iris virginica): 这种鸢尾花通常较大,花瓣较长,花朵颜色深沉。
每个样本都包含了以下四个特征的测量值:

花萼长度(sepal length)(单位:厘米)
花萼宽度(sepal width)(单位:厘米)
花瓣长度(petal length)(单位:厘米)
花瓣宽度(petal width)(单位:厘米)

二、使用步骤

1.引入库

代码如下(示例):

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

其中,from sklearn.datasets import load_iris 是导入 scikit-learn 中的 load_iris 函数,用于加载鸢尾花数据集。这个函数返回一个包含鸢尾花数据集的对象,通常包括数据(特征矩阵)和目标值(标签)。

2.读入数据

代码如下(示例):

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

Number of samples: 150
Number of features: 4

3.划分训练集和测试集

# 加载鸢尾花数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

test_size=0.2 意味着将20%的数据用于测试,80%用于训练。
random_state=42 是为了确保每次运行代码时划分的训练集和测试集保持一致,以便结果可复现。

# 转换为 PyTorch 张量
X_train = torch.FloatTensor(X_train)
y_train = torch.LongTensor(y_train)
X_test = torch.FloatTensor(X_test)
y_test = torch.LongTensor(y_test)

4.构建神经网络

# 定义神经网络模型
class IrisClassifier(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super(IrisClassifier, self).__init__()
        self.layer1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.layer2 = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        x = self.layer1(x)
        x = self.relu(x)
        x = self.layer2(x)
        return x
    # 创建模型、损失函数和优化器
# 设置模型参数
input_size = 4  # 输入特征的数量
hidden_size = 8  # 隐藏层神经元的数量
num_classes = 3  # 输出类别的数量

model = IrisClassifier(input_size, hidden_size, num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

这里使用了交叉熵损失函数 (CrossEntropyLoss),它是用于多分类任务的常见损失函数。在这个例子中,由于鸢尾花分类是一个多类别任务,所以交叉熵损失是一个合适的选择。损失函数用于度量模型输出与真实标签之间的差异,目标是通过调整模型参数来最小化这个差异。
使用 Adam 优化器 (Adam),用于更新神经网络模型的参数。model.parameters() 提供了所有模型参数的迭代器,这些参数将通过优化器进行更新。lr=0.01 指定了学习率,它是控制模型参数更新步长的超参数。调整学习率可以影响模型的收敛速度和性能。

训练模型

# 加载鸢尾花数据集
num_epochs = 100
for epoch in range(num_epochs):
    # 前向传播
    outputs = model(X_train)
    loss = criterion(outputs, y_train)

    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

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

其中,backward进行反向传播
step()进行参数的更新

测试模型

# 测试模型
with torch.no_grad():
    model.eval()
    outputs = model(X_test)
    _, predicted = torch.max(outputs, 1)
    accuracy = (predicted == y_test).sum().item() / y_test.size(0)
    print(f'Test Accuracy: {accuracy:.4f}')

torch.no_grad() 是一个上下文管理器(Context Manager),在这个上下文中的操作将不会被记录用于梯度计算。使用 torch.no_grad() 主要有两个目的:
1.禁用梯度计算: 在深度学习中,有时我们需要进行一些不需要梯度计算的操作,例如在模型推断(inference)阶段或者对于一些参数的更新。通过使用 torch.no_grad(),可以显式地告诉 PyTorch 在这个上下文中不要计算梯度,这有助于减少内存消耗并提高计算速度。

2.减少内存消耗: 在模型推断阶段,我们通常只是使用已经训练好的模型进行预测,而不需要在这个过程中进行梯度计算。通过使用 torch.no_grad(),可以避免存储梯度所需的额外内存。

部分数据展示

输入数据
[-5.25060772e-02 -1.05276654e+00 1.37546573e-01 8.77547895e-04]
输出
1

outputs的输出格例如
tensor([[-5.4479e-01, -3.5709e-02, 3.8968e-01],], grad_fn=)

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值