鸢尾花识别----思路
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的原始数据:
插入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