鸢尾花数据集分类--神经网络

1.1 鸢尾花数据集介绍

iris数据集是用来给莺尾花做分类的数据集,每个样本包含了花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征,我们需要建立一个分类器,该分类器可通过样本的四个特征来来判断样本属于山鸢尾(Setosa)、变色鸢尾(Versicolour)还是维吉尼亚鸢尾(Virginica)中的哪一个,选择神经网络进行分类。

1.2 思路流程
  • 导入鸢尾花数据集
  • 对数据集进行切分,分为训练集和测试集
  • 搭建网络模型
  • 训练网络
  • 将所训练出的模型进行保存(准确率大于90%)
1.3 网络模型

在这里插入图片描述

采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多,故采用Relu作为激活函数

1.4 实现代码

导入所需要的的模块

import torch
import torch.nn as nn
from sklearn import datasets
from sklearn.model_selection import train_test_split

神经网络类

class Net(nn.Module):
    def __init__(self,in_num,out_num,hid_num):
        super(Net,self).__init__()
        self.network = nn.Sequential(
            nn.Linear(in_num,hid_num),
            nn.ReLU(),
            nn.Linear(hid_num,out_num)
        )
        self.optimizer = torch.optim.SGD(self.parameters(), lr=0.05)
        self.loss_func = torch.nn.CrossEntropyLoss()

    def forward(self,x):
        return self.network(x)

    def train(self,x,y):
        out = self.forward(x)
        loss = self.loss_func(out,y)
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()
        print('loss = %.4f' % loss.item())

    def test(self,x):
        return self.forward()

引入数据集,并按照8:2切分训练集和测试集

dataset = datasets.load_iris()
input = torch.FloatTensor(dataset['data'])
label = torch.LongTensor(dataset['target'])
x_train, x_test, y_train, y_test = train_test_split(input, label, test_size=0.2)

如果存在已有训练好的网络则导入,并在总体数据集上测试其准确性

try:
    print("iris_model exist and have been loaded")
    mynet = torch.load('iris_model.pkl')
    output = mynet(input)
    pred_y = torch.max(output, 1)[1].numpy()
    sum = 0
    for i in range(len(label)):
        if pred_y[i] == label[i]:
            sum = sum + 1
   	accuracy = float(sum / len(label))
    print('model accuracy = %d%% (testing on the whole dataset)' % (accuracy * 100))

若不存在训练好的网络则进行训练,直到准确性大于90%后将其保存

except:
    mynet = Net(4,10,3)
    accuracy = 0.0
    while accuracy < 0.9:
        for i in range (10000):
            mynet.train(x_train,y_train)
        output = mynet(x_test)
        pred_y = torch.max(output, 1)[1].numpy()
        sum=0
        for i in range(len(y_test)):
            if pred_y[i] == y_test[i]:
                sum=sum+1
        accuracy = float(sum / len(y_test))
    torch.save(mynet, 'iris_model.pkl')
    print(mynet)
    print("The net have been saved")
    print('accuracy = %d%%' % (accuracy*100))
鸢尾花识别完整代码
import torch
import torch.nn as nn
from sklearn import datasets
from sklearn.model_selection import train_test_split
class Net(nn.Module):
    def __init__(self,in_num,out_num,hid_num):
        super(Net,self).__init__()
        self.network = nn.Sequential(
            nn.Linear(in_num,hid_num),
            nn.ReLU(),
            nn.Linear(hid_num,out_num)
        )
        self.optimizer = torch.optim.SGD(self.parameters(), lr=0.05)
        self.loss_func = torch.nn.CrossEntropyLoss()

    def forward(self,x):
        return self.network(x)

    def train(self,x,y):
        out = self.forward(x)
        loss = self.loss_func(out,y)
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()
        print('loss = %.4f' % loss.item())

    def test(self,x):
        return self.forward()

if __name__ == '__main__':
    dataset = datasets.load_iris()
    input = torch.FloatTensor(dataset['data'])
    label = torch.LongTensor(dataset['target'])
    x_train, x_test, y_train, y_test = train_test_split(input, label, test_size=0.2)
    try:
        print("iris_model exist and have been loaded")
        mynet = torch.load('iris_model.pkl')
        output = mynet(input)
        pred_y = torch.max(output, 1)[1].numpy()
        sum = 0
        for i in range(len(label)):
            if pred_y[i] == label[i]:
                sum = sum + 1
        accuracy = float(sum / len(label))
        print('model accuracy = %d%% (testing on the whole dataset)' % (accuracy * 100))
    except:
        mynet = Net(4,10,3)
        accuracy = 0.0
        while accuracy < 0.9:
            for i in range (10000):
                mynet.train(x_train,y_train)
            output = mynet(x_test)
            pred_y = torch.max(output, 1)[1].numpy()
            sum=0
            for i in range(len(y_test)):
                if pred_y[i] == y_test[i]:
                    sum=sum+1
            accuracy = float(sum / len(y_test))
        torch.save(mynet, 'iris_model.pkl')
        print(mynet)
        print("The net have been saved")
        print('accuracy = %d%%' % (accuracy*100))

github文件链接

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅帅喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值