首页 > 分享 > 深度学习分类步骤——鸢尾花分类

深度学习分类步骤——鸢尾花分类

1.数据集的介绍

以鸢尾花数据集为例,共有150组,每组包括花萼长、花萼宽、花瓣长、花瓣宽4个输入特征。同时给出了这一组特征对应的鸢尾花的类别。类别包括狗尾草鸢尾、杂色鸢尾以及弗吉尼亚鸢尾,分别用0,1,2表示。

数据集读入:从sklearn包datasets读入数据集,如下:

from sklearn.datasets import load_iris

x_data = load_iris().data # 返回iris数据集所有输入特征

y_data = load_iris().target # 返回iris数据集所有标签

from sklearn.datasets import load_iris

from pandas import DataFrame

import pandas as pd

x_data = load_iris().data # 返回iris数据集所有输入特征

y_data = load_iris().target # 返回iris数据集所有标签

print("x_data from datasets:", x_data)

print("y_data from datasets", y_data)

x_data = DataFrame(x_data, columns=['花萼长', '花萼宽', '花瓣长', '花瓣宽'])

pd.set_option('display.unicode.east_asian_width', True) # 设置列名对齐

print(x_data)

x_data['类别'] = y_data # 新加一列,列标签‘类别’,数据为y_data

print("x_data add a column: n", x_data)

 2.鸢尾花分类

准备数据  数据集读入数据集乱序生成永不相见的训练集和测试集(即x_train / y_train, x_test / y_test)配成(输入特征,标签)对每次读入一小撮(batch)

     2.搭建网络

定义神经网络中所有可训练参数

     3. 参数优化

嵌套循环迭代,with结构更新参数,显示当前loss

    4. 测试效果

计算房前参数前向传播后的准确率,显示当前acc

    5.acc / loss可视化 

3.鸢尾花分类案例

完整程序:

from sklearn.datasets import load_iris

from pandas import DataFrame

import pandas as pd

import numpy as np

import tensorflow as tf

from matplotlib import pyplot as plt

import os

import PySide2

dirname = os.path.dirname(PySide2.__file__)

plugin_path = os.path.join(dirname, 'plugins', 'platforms')

os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path

# 定义超参数和画图用的两个存数据的空列表

lr = 0.1

train_loss_results = [] # 将每轮的loss记录在此列表中,为后续画loss曲线提供数据

test_acc = [] # 将每轮的acc记录在此列表中,为后续画acc曲线提供数据

epoch = 300

loss_all = 0 # 每轮分为4个step(因为一共有120个训练数据,每个batch有32个样本,所以epoch迭代一次120个数据需要4个batch),loss_all记录四个step生成的4个loss的和

# ____________________________数据准备______________________________

# 1.数据集的读入

x_data = load_iris().data # 返回iris数据集所有输入特征

y_data = load_iris().target # 返回iris数据集所有标签

# print("x_data from datasets:", x_data)

# print("y_data from datasets", y_data)

# 2.数据集乱序

np.random.seed(116) # 使用相同的种子seed,使得乱序后的数据特征和标签仍然可以对齐

np.random.shuffle(x_data) # 打乱数据集

np.random.seed(116)

np.random.shuffle(y_data)

tf.random.set_seed(116)

# 3.数据集分出永不相见的训练集和测试集

x_train = x_data[:-30] # 前120个数据作为训练集

y_train = y_data[:-30] # 前120个标签作为训练集标签

x_test = x_data[-30:] # 后30个数据集作为测试集

y_test = y_data[-30:]

# 转换x的数据类型,否则后面矩阵相乘时会因为数据类型不一致报错

x_train = tf.cast(x_train, tf.float32)

x_test = tf.cast(x_test, tf.float32)

# 配成【输入特征, 标签】对,每次喂入一小撮(batch)(把数据集分为批次,每批次32组数据)

train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)

test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

# ____________________________定义神经网络______________________________

w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1)) # 4表示输入的4的特征,3表示3分类

b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1)) # 3表示3分类

# ____________________________训练部分:嵌套循环迭代_______________________

for epoch in range(epoch): # 数据集级别迭代

for step, (x_train, y_train) in enumerate(train_db): # batch级别迭代

with tf.GradientTape() as tape: # 在with结构中计算前向传播y以及计算总损失loss

y = tf.matmul(x_train, w1) + b1 # 神经网络乘加运算

y = tf.nn.softmax(y) # 使输出y符合概率分布(此操作后与独热码同量级,可以相减求loss)

y_ = tf.one_hot(y_train, depth=3) # 将标签值转换为独热码格式,方便计算loss和acc

loss = tf.reduce_mean(tf.square(y_ - y)) # 采用均值方差损失函数MSE

loss_all += loss.numpy() # 将每个step计算出loss累加,为后续求loss平均值提供数据

# 计算loss对各个参数的梯度

grads = tape.gradient(loss, [w1, b1]) # 损失函数loss分别对参数w1和b1计算偏导数

# 实现梯度更新 w1 = w1 - lr * w1_grad b = b - lr * b_grad

w1.assign_sub(lr * grads[0]) # 参数w1自更新

b1.assign_sub(lr * grads[1]) # 参数b1自更新

# 求出每个epoch的平均损失

print("Epoch {}, loss:{}".format(epoch, loss_all/4))

train_loss_results.append(loss_all / 4) # 将4个step的loss求平均记录在此变量中

loss_all = 0 # loss_all归零为记录下一个epoch的loss做准备

# ____________________________测试部分:识别准确率______________________________

total_correct, total_number = 0, 0

for x_test, y_test in test_db:

y = tf.matmul(x_test, w1) + b1 # y为预测结果

y = tf.nn.softmax(y) # y符合概率分布

pred = tf.argmax(y, axis=1) # 返回y中最大值的索引,即预测的分类

pred = tf.cast(pred, dtype=y_test.dtype) # 调整数据类型与标签一致,即为把pred预测值转换为y_test数据类型

correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32) # 如果真实值与预测值相同,就正确

correct = tf.reduce_sum(correct) # 将每个batch的correct加起来

total_correct += int(correct) # 将所有batch中的correct数加起来

total_number += x_test.shape[0]

# 总的准确率等于total_correct / total_number

acc = total_correct / total_number

test_acc.append(acc)

print("test_acc", acc)

print("__________________________")

# ____________________________acc / loss 可视化___________________________

# 绘制loss曲线

plt.title("Loss Curve")

plt.xlabel("Epoch")

plt.ylabel("Loss")

plt.plot(train_loss_results, label="$Loss$") #逐点画出test_acc值并连线

plt.legend()

plt.show()

# 绘制Accuracy曲线

plt.title("Acc Curve")

plt.xlabel("Epoch")

plt.ylabel("Acc")

plt.plot(test_acc, label="$Accuracy$") #逐点画出test_acc值并连线

plt.legend()

plt.show()

相关知识

深度学习鸢尾花分类实验报告 鸢尾花实验目的
深度学习分类步骤——鸢尾花分类
KNN鸢尾花分类
机器学习与深度学习对鸢尾花数据集分类对比
深度学习入门——基于TensorFlow的鸢尾花分类实现(TensorFlow
基于KNN的鸢尾花分类
鸢尾花分类,一个经典的机器学习教科书案例
【机器学习】鸢尾花分类
神经网络与深度学习(五)前馈神经网络(3)鸢尾花分类
教程:对鸢尾花进行分类

网址: 深度学习分类步骤——鸢尾花分类 https://m.huajiangbk.com/newsview1675263.html

所属分类:花卉
上一篇: 机器学习项目1:鸢尾花分类
下一篇: Python机器学习基础教程——