Pytorch函数基础:鸢尾花数据集分类

博客框架

  1. 引言

    • 简要介绍机器学习和分类问题
    • 介绍鸢尾花数据集
    • 简述 PyTorch 的作用及其在深度学习中的重要性
  2. 环境准备

    • 安装所需的库(PyTorch、NumPy、Matplotlib、Pandas等)
    • 创建并激活 Python 虚拟环境(可选)
  3. 数据加载与预处理

    • 从 CSV 文件读取数据
    • 数据转换和标准化
    • 将数据转换为 PyTorch Tensor
  4. 定义神经网络模型

    • 介绍模型架构
    • 定义前向传播函数
  5. 训练模型

    • 设置损失函数和优化器
    • 训练循环及损失曲线可视化
  6. 评估模型

    • 计算模型的预测准确率
    • 测试模型的性能
  7. 附录

    • 代码完整示例
    • 参考文献与资源链接

博客详细内容

1. 引言

在机器学习中,分类问题是一个基础且广泛应用的任务。鸢尾花数据集是一个经典的分类数据集,它包含了三种鸢尾花的特征数据。本文将使用 PyTorch 框架构建一个简单的神经网络模型来对鸢尾花进行分类,并展示如何处理数据、训练模型以及评估模型性能。

2. 环境准备

在开始之前,我们需要安装以下库:

import numpy as np
import torch
import matplotlib.pyplot as plt
import csv

此外,建议使用 Python 虚拟环境来管理项目依赖。

3. 数据加载与预处理
首先需要下载鸢尾花数据集     -附下载链接

点击下载icon-default.png?t=N7T8https://pan.baidu.com/s/1mfSAqKEawSdmr0Dv_9Xteg?pwd=q7qx 提取码: q7qx随后和代码文件放在同一文件夹下面

with open("iris.csv", 'r') as csvfile:
    reader = csv.reader(csvfile)
    next(reader)  # 跳过标题行
    for row in reader:
        index.append(row[0])
        sl.append(float(row[1]))
        sw.append(float(row[2]))
        pl.append(float(row[3]))
        pw.append(float(row[4]))
        species.append(row[5])

读取CSV文件,随后将每一列数据保存在列表中 。标题行可以使用next(reader)函数跳过不计入列表之中。

  1. 数据集之中,种类是由英文来进行区分。我们可以将种类标签转化为数字来表示。
  2. 为了将分散的列表组合成一个完整的数据集,使用list(zip(列表1,列表2......))函数来进行转换。
  3. 将Numpy类型的数据转换为Tensor数据类型,两种类型的区别是:前者只能在CPU运行,后者既可以在CPU运行也可以在GPU运行,实现加速运算。
# 将种类标签转换为数字
species_mapping = {'setosa': 0, 'versicolor': 1, 'virginica': 2}
species = [species_mapping[sp] for sp in species]

# 转换为NumPy数组
input_data = np.array(list(zip(sl, sw, pl, pw)), dtype=np.float32)
label_data = np.array(species, dtype=np.int64)

# 转换为Tensor
input = torch.FloatTensor(input_data)
label = torch.LongTensor(label_data)
4. 定义神经网络模型
截止于此,都没有涉及Pytorch知识点。下面是定义网络模型的代码,鸢尾花分类我们使用最基础的BP神经网络来实现。
# 定义bp神经网络  定义网络架构
class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.output = torch.nn.Linear(n_hidden, n_output)

    def forward(self, X):
        X = torch.nn.functional.relu(self.hidden(X))
        X = self.output(X)
        return X

定义一个网络模型类Net,继承torch.nn.Module类。torch.nn.Module类是所有网络模型的结构,我们可以在此结构上进行自定义设计。

随后要对类进行初始化工作,__init__函数就是网络模型的构造函数。其中传入BP神经网络的参数

 n_feature、n_hidden、n_output。分别的含义是输入的维度(输入的特征的个数)、隐藏层的数量、输出的个数。对于鸢尾花数据集,输入的特征是4,输出的特征的1,而隐藏层的个数自己定义(过大和过小都会对模型有负面影响)

最后要重写forward函数,经过激活函数(输入是隐藏层的输出)、再经过输出函数(输入是激活函数的输出)。

5. 训练模型
# 网络结构情况
net = Net(n_feature=4, n_hidden=40, n_output=3)
opt = torch.optim.SGD(net.parameters(), lr=0.02)
loss_func = torch.nn.CrossEntropyLoss()
  1.  首先定义网络模型的结构
  2. 再次指定网络模型的优化器
  3. 最后定义计算loss函数的类型
for epoch in range(400):
    out = net(input)
    loss = loss_func(out, label)
    losses.append(loss.item())
    opt.zero_grad()
    loss.backward()
    opt.step()

 通过for循环来训练模型,训练400次并以此记录loss值进行绘图。

6. 评估模型
# 可视化损失值变化
plt.figure(figsize=(10, 6))  # 设置图像大小
plt.plot(losses, color='blue', linestyle='-', marker='o', markersize=5)  # 添加颜色、线条样式和标记
plt.xlabel('Epoch', fontsize=14)
plt.ylabel('Loss', fontsize=14)
plt.title('Loss During Training', fontsize=16)
plt.grid(True)  # 添加网格线
plt.tight_layout()  # 自动调整子图参数,使之填充整个图像区域
plt.show()

# 测试预测
out = net(input)
predicted = torch.max(out, 1)[1]            #返回最大值及其索引  所以[1]就是索引值    返回的是tensor
print(type(predicted))
pred_y = predicted.data.numpy()
target_y = label.data.numpy()
accuracy = float((pred_y == target_y).astype(int).sum()) / float(target_y.size)

print("莺尾花预测准确率", accuracy)
8. 附录

完整代码示例

import numpy as np
import torch
import matplotlib.pyplot as plt
import csv

index = []
sl = []
sw = []
pl = []
pw = []
species = []

# csv 文件读取
with open("iris.csv", 'r') as csvfile:
    reader = csv.reader(csvfile)
    next(reader)  # 跳过标题行
    for row in reader:
        index.append(row[0])
        sl.append(float(row[1]))
        sw.append(float(row[2]))
        pl.append(float(row[3]))
        pw.append(float(row[4]))
        species.append(row[5])

# 将种类标签转换为数字
species_mapping = {'setosa': 0, 'versicolor': 1, 'virginica': 2}
species = [species_mapping[sp] for sp in species]

# 转换为NumPy数组
input_data = np.array(list(zip(sl, sw, pl, pw)), dtype=np.float32)
label_data = np.array(species, dtype=np.int64)

# 转换为Tensor
input = torch.FloatTensor(input_data)
label = torch.LongTensor(label_data)

# 定义bp神经网络  定义网络架构
class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.output = torch.nn.Linear(n_hidden, n_output)

    def forward(self, X):
        X = torch.nn.functional.relu(self.hidden(X))
        X = self.output(X)
        return X

# 网络结构情况
net = Net(n_feature=4, n_hidden=40, n_output=3)
opt = torch.optim.SGD(net.parameters(), lr=0.02)
loss_func = torch.nn.CrossEntropyLoss()

losses = []

for epoch in range(400):
    out = net(input)
    loss = loss_func(out, label)
    losses.append(loss.item())
    opt.zero_grad()
    loss.backward()
    opt.step()

# 可视化损失值变化
plt.figure(figsize=(10, 6))  # 设置图像大小
plt.plot(losses, color='blue', linestyle='-', marker='o', markersize=5)  # 添加颜色、线条样式和标记
plt.xlabel('Epoch', fontsize=14)
plt.ylabel('Loss', fontsize=14)
plt.title('Loss During Training', fontsize=16)
plt.grid(True)  # 添加网格线
plt.tight_layout()  # 自动调整子图参数,使之填充整个图像区域
plt.show()

# 测试预测
out = net(input)
predicted = torch.max(out, 1)[1]            #返回最大值及其索引  所以[1]就是索引值    返回的是tensor
print(type(predicted))
pred_y = predicted.data.numpy()
target_y = label.data.numpy()
accuracy = float((pred_y == target_y).astype(int).sum()) / float(target_y.size)

print("莺尾花预测准确率", accuracy)

结语

希望这篇博客能够帮助你入门 PyTorch,并了解如何使用它来解决分类问题。如果你有任何问题或建议,请在评论区留言。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 PyTorch 来解决鸢尾花数据集的示例代码: ``` import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from sklearn import datasets import numpy as np # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 将数据转换为 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).long() y_test = torch.from_numpy(y_test).long() # 定义一个简单的网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc = nn.Linear(4, 3) def forward(self, x): x = self.fc(x) return x net = Net() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters()) # 定义训练过程 for epoch in range(100): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch + 1} loss: {running_loss / (i + 1)}") # 测试 with torch.no_grad(): correct = 0 total = 0 for data in test_loader: inputs, labels = data outputs = net(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f"Accuracy: {correct / total}") ``` 这是一个简单的示例,你可以按照需要调整网络结构和参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值