首页 > 其他分享 >Pytorch函数基础:鸢尾花数据集分类

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

时间:2024-08-09 10:24:09浏览次数:16  
标签:plt 函数 self torch Pytorch 鸢尾花 hidden append row

博客框架

  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,并了解如何使用它来解决分类问题。如果你有任何问题或建议,请在评论区留言。

标签:plt,函数,self,torch,Pytorch,鸢尾花,hidden,append,row
From: https://blog.csdn.net/qq_57707571/article/details/141052473

相关文章

  • 如何使用Power BI的CALENDARAUTO()函数
    First,youshouldbeawareofthe CALENDARAUTO() isapredefinedfunctionthatisusedtoauto-generatecalendardatesrangebasedonadatefieldinthecurrentmodel.Soifthecurrentmodeldoesn'thaveatablewithadatefieldyouwillget CALEN......
  • C++ 禁用类的拷贝构造函数和赋值运算符
    C++中如果没有显式定义类的构造函数和赋值运算符,编译器会自动生成对应的函数,但是对于一些含有指针成员变量的类,自动生成的成员函数只会进行浅拷贝,会导致动态申请的内存在对象析构的时候doublefree,引起崩溃的问题。因此如果没有必要,通常会禁用该接口,避免用户调用该接口造成问题。......
  • 同时运行多个异步阻塞函数 - Python
    我是Python和协程的新手,我正在尝试利用Python的asyncio库来并行处理阻塞函数。我正在使用python3.8.6。我有一个阻塞函数,它从数组输入中接收不同的输入,我需要每个输入的阻塞函数同时运行。我已经尝试过,但它们似乎仍然按顺序运行:asyncdefmain():tasks=[asyncio......
  • Python 和 Excel:将数据放入另一个函数中,然后从中获取信息
    我正在尝试将温度/压力数据放入蒸汽表以获得过热焓数据。我已经成功地获取了数据并将其放入Excel文件中,然后它为我提取了焓数据。问题是,当我将温度和压力数据放入蒸汽表时,它实际上并没有进行双重插值,因此焓(H)值实际上从未改变ng。我最终只得到了蒸汽数据中给出......
  • 【C++】构造函数类别
    1、默认构造函数形式:没有入参调用方式:直接定义声明:Constructor();调用:Constructorc;2、初始化构造函数形式:有参数列表调用方式:传参即可声明:Constructor(inta,intb);调用:Constructorc(1,2);3、拷贝构造函数形式:参数为变量常引用调用方式:当使用现有对象初......
  • 编写一个函数接受这些参数:内含int类型元素的数组名,数组的大小和一个代表选取次数的值
    /编写一个函数接受这些参数:内含int类型元素的数组名,数组的大小和一个代表选取次数的值。该函数从数组中随机指定数量的元素,并打印他们。每个元素只能选择一次(模拟抽奖数字或挑选陪审团成员)。另外,如果你的实现有time()或类似的函数,可以在srand()中使用这个函数的输出来初始化......
  • einsum 函数
    einsum是Einsteinsummation的缩写,即爱因斯坦求和约定。einsum函数源自NumPy,后来在PyTorch等其他科学计算库中也得到了实现。它是一种强大而灵活的函数,可以用来处理各种张量运算,如矩阵乘法、转置、批量点积、内积、外积等。爱因斯坦求和约定(EinsteinSummationConvent......
  • 函数式编程-Stream流
    一、函数式编程-Stream流1、概述1.1为什么学?能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱普通写法与函数式编程写法对比:普通写法//查询未成年作家的评分在70以上的书籍由于洋流影响所以作家和书籍可能出现重复,需要进行去重List<B......
  • C语言学习笔记 Day8(函数)
    Day8 内容梳理:目录Chapter6 函数6.0概述6.1 定义函数6.2 调用函数(1)实参&形参(2)调用无参函数(3)调用有参函数6.3 声明函数6.4 终止函数(exit&return)6.5多文件编程(1)设置主文件(2)创建头文件(3)导入头文件Chapter6 函数6.0概述函数的分类(2种):   ......
  • 教你领悟函数递归的本质
    一、何为递归①在C语言中,递归就是函数自己调用自己。递是指递推,归是指回归。②递归的思想:将复杂的问题简单化。③递推的两个必要条件。a:递归存在限制条件,当满足限制条件时,递归便不再继续b:每一次递归都要越来越接近限制条件/*用递归的方式求n!(n>=0)*/intFact(i......