鸢尾花识别

本文介绍鸢尾花识别的过程,包括获取鸢尾花数据,数据预处理,搭建神经网络模型,训练网络并优化参数,以及保存最优模型进行鸢尾花分类。通过分析鸢尾花的四个特征,使用深度学习模型进行分类,最终实现高准确率的识别。
摘要由CSDN通过智能技术生成

鸢尾花识别----思路

1)获取鸢尾花数据,分析处理。
2)整理数据位训练集,测试集。
3)搭建神经网络模型。
4)训练网络,优化网络模型参数。
5)保存最优的模型,进行鸢尾花识别

一.获取鸢尾花数据,分析处理

1.鸢尾花分类
在这里插入图片描述
2.鸢尾花特征

三种鸢尾花共同特征是:花萼长、花萼宽、花瓣长、花瓣宽。四个特征四个神经元。

通过测量可以根据以下特点来区分鸢尾花类别:

  • 杂色鸢尾花:花萼长>花萼宽且花瓣长/花瓣宽>2

3.从iris数据集(也成鸢尾花数据集)获取数据
鸢尾花的四个属性特征作为输入特征,也就是有四个神经元:花萼长、花萼宽、花瓣长、花瓣宽

这个数据集包含了150个鸢尾花样本,对应3种鸢尾花,各50个样本,以及它们各自对应的4种关于花外形的数据 ,适用于分类任务。

类别作为标签,0 代表狗尾草鸢尾,1 代表杂色鸢尾,2 代表弗吉尼亚鸢尾。
x_data 存放 iris数据集所有输入特征(4 种);y_data存放 iris数据集所有标签(3种)
代码如下:

在这里插入图片描述

我们输出在sklearn库中,x_data,y_data的原始数据:
x_data数据
在这里插入图片描述
插入y_data后的x_data数据为
在这里插入图片描述

二。整理数据位训练集,测试集

把输入特征 和 标签 做成数据对,即每一行输入特征有与之对应的类别;得出一共150行数据;其中75%作为训练集,即120行;25%作为测试集,即后30行
注:训练集和测试集,没有交集,它们之间没有一样的数据

在这里插入图片描述

三。搭建神经网络模型

从数据分析出,有四个输入特征,所以输入层有4个神经元节点;鸢尾花有三种类别,所以输出层有三个节点,我们需要初始化网络中的参数(权值,偏置)

通过前向传播计算,即从输入层到输出层迭代计算,预测出是哪个类别的鸢尾花,对比是否预测正确(通过损失函数计算出预测值和真实值的偏差,这个偏差越小代表预测越接近真实;最终选择最优的参数)

输入层和输出层之间的映射关系接近正确的,模型基本训练好了
在这里插入图片描述

输出 y 中,1.01 代表 0 类鸢尾得分,2.01 代表 1 类鸢尾得分,-0.66 代表 2 类鸢尾得分。通过输出 y 可以看出数值最大(可能性最高)的是 1 类鸢尾,而5不是标签 0 类鸢尾。这是由于最初的参数 w 和 b 是随机产生的,现在输出的结果是不准确的。

为了修正这一结果,我们用 损失函数,定义预测值 y 和标准答案(标签)_y 的差距,损失函数可以定量的判断当前这组参数 w 和 b 的优劣,当损失函数最小时,即可得到最优 w 的值和 b 的值。

损失函数,其目的是寻找一组参数 w 和 b 使得损失函数最小。为达成这一目的,我们采用梯度下降的方法。

损失函数的梯度 表示损失函数对各参数求偏导后的向量,损失函数梯度下降的方向,就是是损失函数减小的方向。梯度下降法即沿着损失函数梯度下降的方向,寻找损失函数的最小值,从而得到最优的参数。

四.训练网络,优化网络模型参数

for epoch in range(epoch):  #数据集级别的循环,每个epoch循环一次数据集
    for step, (x_train, y_train) in enumerate(train_db):  #batch级别的循环 ,每个step循环一个batch
        with tf.GradientTape() as tape:  # with结构记录梯度信息
            y = tf.matmul(x_train, w1) + b1  # 神经网络乘加运算
            y = tf.nn.softmax(y)  # 使输出y符合概率分布(此操作后与独热码同量级,可相减求loss)
            y_ = tf.one_hot(y_train, depth=3)  # 将标签值转换为独热码格式,方便计算loss和accuracy
            loss = tf.reduce_mean(tf.square(y_ - y))  # 采用均方误差损失函数mse = mean(sum(y-out)^2)
            loss_all += loss.numpy()  # 将每个step计算出的loss累加,为后续求loss平均值提供数据,这样计算的loss更准确
        # 计算loss对各个参数的梯度
        grads = tape.gradient(loss, [w1, b1])
 
        # 实现梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_grad
        w1
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值