博客框架
-
引言
- 简要介绍机器学习和分类问题
- 介绍鸢尾花数据集
- 简述 PyTorch 的作用及其在深度学习中的重要性
-
环境准备
- 安装所需的库(PyTorch、NumPy、Matplotlib、Pandas等)
- 创建并激活 Python 虚拟环境(可选)
-
数据加载与预处理
- 从 CSV 文件读取数据
- 数据转换和标准化
- 将数据转换为 PyTorch Tensor
-
定义神经网络模型
- 介绍模型架构
- 定义前向传播函数
-
训练模型
- 设置损失函数和优化器
- 训练循环及损失曲线可视化
-
评估模型
- 计算模型的预测准确率
- 测试模型的性能
-
附录
- 代码完整示例
- 参考文献与资源链接
博客详细内容
1. 引言
在机器学习中,分类问题是一个基础且广泛应用的任务。鸢尾花数据集是一个经典的分类数据集,它包含了三种鸢尾花的特征数据。本文将使用 PyTorch 框架构建一个简单的神经网络模型来对鸢尾花进行分类,并展示如何处理数据、训练模型以及评估模型性能。
2. 环境准备
在开始之前,我们需要安装以下库:
import numpy as np
import torch
import matplotlib.pyplot as plt
import csv
此外,建议使用 Python 虚拟环境来管理项目依赖。
3. 数据加载与预处理
首先需要下载鸢尾花数据集 -附下载链接
点击下载https://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)函数跳过不计入列表之中。
- 数据集之中,种类是由英文来进行区分。我们可以将种类标签转化为数字来表示。
- 为了将分散的列表组合成一个完整的数据集,使用list(zip(列表1,列表2......))函数来进行转换。
- 将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()
- 首先定义网络模型的结构
- 再次指定网络模型的优化器
- 最后定义计算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