鸢尾花分类-pytorch实现

前言

本文用pytorch实现了鸢尾花分类,数据不多,只做代码展示用,后续有升级版本。

代码

'''
-*- coding: utf-8 -*-
@File  : main.py
@Author: Shanmh
@Time  : 2024/05/06 上午9:37
@Function:
'''
import torch
from sklearn import datasets
import torch.nn as nn

#1.数据准备
dataset=datasets.load_iris()
print(dataset["data"][:10])
print(dataset["target"][:10])
i_data=torch.FloatTensor(dataset["data"])
i_target=torch.LongTensor(dataset["target"])

#2.模型构建
class IrisModel(nn.Module):
    def __init__(self,input_n=4,hidden_n=20,output_n=3):
        super().__init__()
        self.line1=nn.Linear(input_n,hidden_n)
        self.line2=nn.Linear(hidden_n,output_n)
        self.relu=nn.ReLU()
    def forward(self,x):
        x=self.line1(x)
        x=self.relu(x)
        x=self.line2(x)
        return x

#3.参数定义
epoch=500
lr=0.01

model=IrisModel()
optimizer=torch.optim.SGD(model.parameters(),lr=lr) #定义优化器
loss_fun=torch.nn.CrossEntropyLoss() #多分类采用交叉熵损失函数


for e in range(epoch):
    out=model(i_data)
    loss=loss_fun(out,i_target)
    optimizer.zero_grad()  # 梯度清零
    loss.backward()  # 前馈操作
    optimizer.step()


# 5. 得出结果
out = model(i_data)
prediction = torch.max(out, 1)[1]
pred_y = prediction.data.numpy()
target_y = i_target.data.numpy()
result=pred_y==target_y
print(f"模型预测准确度,acc:{'{:.2f}'.format(len(result[result==True])/len(result))}%")

展望

1.还在考虑中怎么进行建模,建一个4维空间用来直接看出输入与输出的关系

2.有尝试过标签平滑,从结果上看不出什么区别,再想怎么可视化出来

3.怎么从结果倒推出可用的输入数据

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个基于Python的开源机器学习库,它提供了丰富的工具和函数来简化深度学习模型的开发和训练过程。下面是使用PyTorch实现尾花分类的一般步骤: 1. 导入必要的库和模块: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset ``` 2. 准备数据集: 首先,你需要准备尾花数据集。可以使用`torchvision.datasets`中的`datasets`模块来加载常见的数据集,或者自己创建一个继承自`torch.utils.data.Dataset`的数据集类。 3. 创建模型: 定义一个继承自`torch.nn.Module`的模型类,并在其中定义模型的结构。可以使用`torch.nn`中的各种层(如全连接层、卷积层等)来构建模型。 4. 定义损失函数和优化器: 选择适当的损失函数(如交叉熵损失)和优化器(如随机梯度下降SGD)来训练模型。 5. 训练模型: 使用训练数据对模型进行训练。通过迭代训练数据集中的样本,计算损失并反向传播更新模型参数。 6. 模型评估: 使用测试数据对训练好的模型进行评估,计算模型在测试集上的准确率或其他指标。 下面是一个简单的示例代码,演示了如何使用PyTorch实现尾花分类: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 准备数据集 iris = load_iris() X = iris.data y = iris.target # 数据预处理 scaler = StandardScaler() X = scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义数据集类 class IrisDataset(Dataset): def __init__(self, X, y): self.X = torch.tensor(X, dtype=torch.float32) self.y = torch.tensor(y, dtype=torch.long) def __len__(self): return len(self.X) def __getitem__(self, idx): return self.X[idx], self.y[idx] # 创建模型类 class IrisClassifier(nn.Module): def __init__(self): super(IrisClassifier, self).__init__() self.fc1 = nn.Linear(4, 16) self.fc2 = nn.Linear(16, 3) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 创建数据加载器 train_dataset = IrisDataset(X_train, y_train) train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True) # 创建模型和优化器 model = IrisClassifier() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 训练模型 num_epochs = 100 for epoch in range(num_epochs): for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 模型评估 test_dataset = IrisDataset(X_test, y_test) test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False) correct = 0 total = 0 with torch.no_grad(): for inputs, labels in test_loader: outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = correct / total print(f"Accuracy: {accuracy}") ``` 这是一个简单的示例,你可以根据需要进行修改和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值