神经网络实现鸢尾花分类

一、数据准备

    1、数据集读入

2、数据集乱序

3、生成训练集和测试集(即 x_train / y_train,x_test / y_test)

4、配成(输入特征,标签)对,每次读入一小撮(batch)

二、搭建网络

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

三、参数优化

    1、嵌套循环迭代,with 结构求得损失函数 loss 对每个可训练参数的偏导数,更新这些可训练参数,显示当前 loss

四、测试效果

    1、计算当前参数前向传播后的准确率,显示当前 accuracy(准确率)

五、accuracy(准确率) / loss(损失) 可视化

1、画出损失函数 loss(损失) 的变化曲线图

2、画出 accuracy(准确率) 的变化曲线图

六、完整代码

# -*- coding: UTF-8 -*-
# 利用鸢尾花数据集,实现前向传播、反向传播,可视化loss曲线# 导入所需模块
import numpy as np
import tensorflow as tffrom sklearn import datasets
from matplotlib import pyplot as pltclass ClassificationIrises(object):def __init__(self):self.x_data = None    # 输入特征数据集self.y_data = None    # 标签数据集self.x_train = None    # 输入特征训练数据self.y_train = None    # 标签训练数据self.x_test = None    # 输入特征测试数据self.y_test = None    # 标签测试数据self.train_db = None    # 训练数据集分批次,每个批次batch组数据self.test_db = None    # 测试数据集分批次,每个批次batch组数据self.w = 0    # wself.b = 0    # bself.lr = 0.1    # 学习率self.train_loss_results = []    # 每轮的loss记录self.test_accuracy = []    # 每轮的accuracy记录self.epoch = 500    # 循环轮次self.loss_all = 0    # 每轮分4个step生成的4个loss的和self.total_correct = 0    # 所有batch的correct数累加和self.total_number = 0    # 测试的总样本数def run(self):# 1、数据准备# 数据集读入self.read_data_set()# 数据集乱序self.data_set_out_of_order()# 生成训练集和测试集(即 x_train / y_train,x_test / y_test)self.generate_train_test_data_set()# 配成(输入特征,标签)对,每次读入一小撮(batch)self.assembly_tag_pair()# 2、搭建网络# 定义神经网络中所有可训练参数self.define_parameters()# 3、参数优化# 嵌套循环迭代,with结构求得损失函数loss对每个可训练参数的偏导数,更新这些可训练参数,显示当前loss# 数据集级别的循环,每个epoch循环一次数据集for epoch in range(self.epoch):# 训练部分self.train()# 计算当前参数前向传播后的loss,显示当前lossself.computational_loss(epoch)# 4、测试效果# 测试部分self.test()# 计算当前参数前向传播后的准确率,显示当前accuracy(准确率)self.computational_accuracy(epoch)# 5、accuracy(准确率) / loss(损失) 可视化# 画出accuracy(准确率)的变化曲线图self.accuracy_cuver()# 画出损失函数 loss(损失) 的变化曲线图 self.loss_cuver()def accuracy_cuver(self):"""绘制 Accuracy 图像 """# 图像标题plt.title("Accuracy Curve")# x轴变量名称plt.xlabel("Epoch")# y轴变量名称plt.ylabel("Accuracy")# 逐点画出test_accuracy值并连线,连线图标是Accuracyplt.plot(self.test_accuracy, label="$Accuracy$")# 画出曲线图标plt.legend()# 画出图像plt.show()def loss_cuver(self):"""绘制 loss """# 图像标题plt.title("Loss Function Curve")# x轴变量名称plt.xlabel("Epoch")# y轴变量名称plt.ylabel("Loss")# 逐点画出train_loss_results值并连线,连线图标是Lossplt.plot(self.train_loss_results, label="$Loss$")# 画出曲线图标plt.legend()# 画出图像plt.show()def computational_accuracy(self, epoch):"""总的准确率等于total_correct/total_number"""accuracy = self.total_correct / self.total_numberself.test_accuracy.append(accuracy)# 每个epoch,打印accuracy信息print("Epoch {}, accuracy {}".format(epoch, accuracy))print("-------------------------------------")# total_correct、total_number归零,为计算下一轮次的准确率做准备self.total_correct, self.total_number = 0, 0def test(self):"""测试部分"""for x_test, y_test in self.test_db:# 使用更新后的参数进行预测y = tf.matmul(x_test, self.w) + self.by = tf.nn.softmax(y)# 返回y中最大值的索引,即预测的分类pred = tf.argmax(y, axis=1)# 将pred转换为y_test的数据类型pred = tf.cast(pred, dtype=y_test.dtype)# 若分类正确,则correct=1,否则为0,将bool型的结果转换为int型correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)# 将每个batch的correct数加起来correct = tf.reduce_sum(correct)# 将所有batch的correct数加起来self.total_correct = tf.reduce_sum(correct)# total_number为测试的总样本数,也就是x_test的行数,shape[0]返回变量的行数self.total_number += x_test.shape[0]def computational_loss(self, epoch):"""计算loss"""# 每个epoch,打印loss信息print("Epoch {}, lossL {}".format(epoch, self.loss_all / 4))# 将4个step的loss求平均记录在此变量中self.train_loss_results.append(self.loss_all / 4)# loss_all归零,为记录下一个epoch的loss做准备self.loss_all = 0def train(self):"""训练部分"""# batch级别的循环,每个step循环一个batchfor step, (x_train, y_train) in enumerate(self.train_db):# with结构记录梯度信息with tf.GradientTape() as tape:# 神经网络乘加运算:y = wx + by = tf.matmul(x_train, self.w) + self.b# 使输出y符合概率分布(此操作后与独热码同量级,可相减求loss)y = tf.nn.softmax(y)# 将标签值转换为独热码格式,方便计算loss和accuracyy_ = tf.one_hot(y_train, depth=3)# 采用均方误差损失函数:mse = mean(sum(y-out)^2)loss = tf.reduce_mean(tf.square(y_ - y))# 将每个step计算出的loss累加,为后续求loss平均值提供数据,这样计算的loss更准确self.loss_all += loss.numpy()# 计算loss对各个参数的梯度grads = tape.gradient(loss, [self.w, self.b])# 实现梯度更新 w = w - lr * w_grad  b = b - lr * b_grad# 参数w自更新self.w.assign_sub(self.lr * grads[0])# 参数b自更新self.b.assign_sub(self.lr * grads[1])def define_parameters(self):"""生成神经网络的参数"""# 4个输入特征,故输入层为4个输入节点;因为是3分类,故输出层为3个神经元# 用 tf.Variable() 标记参数可训练# tf.random.truncated_normal(#     shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32, seed=None, name=None# ):从截断的正态分布中输出随机值。# shape:一维整数Tensor或Python数组。输出张量的形状。# mean:类型为的0-D Tensor或Python值dtype。截断正态分布的平均值。# stddev:类型0的Tensor或Python值dtype。截断前正态分布的标准偏差。# dtype:输出的类型。# seed:一个Python整数。用于为分发创建随机种子。使每次生成的随机数相同。# name:操作的名称(可选)。self.w = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))self.b = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))# 学习率self.lr = 0.1# 将每轮的loss记录在此列表中,为后续画loss曲线提供数据self.train_loss_results = []# 将每轮的accuracy记录在此列表中,为后续画accuracy曲线提供数据self.test_accuracy = []# 循环 500 轮self.epoch = 500# 每轮分4个step,loss_all记录四个step生成的4个loss的和self.loss_all = 0def assembly_tag_pair(self):"""from_tensor_slices 函数使输入特征和标签值一一对应"""# 把数据集分批次,每个批次batch组数据self.train_db = tf.data.Dataset.from_tensor_slices((self.x_train, self.y_train)).batch(32)self.test_db = tf.data.Dataset.from_tensor_slices((self.x_test, self.y_test)).batch(32)def generate_train_test_data_set(self):"""将打乱后的数据集分割为训练集和测试集"""# 训练集为前120行,测试集为后30行self.x_train = self.x_data[:-30]self.y_train = self.y_data[:-30]self.x_test = self.x_data[-30:]self.y_test = self.y_data[-30:]# 转换x的数据类型,否则后面矩阵相乘时会因数据类型不一致报错self.x_train = tf.cast(self.x_train, tf.float32)self.x_test = tf.cast(self.x_test, tf.float32)def data_set_out_of_order(self):"""随机打乱数据(因为原始数据是顺序的,顺序不打乱会影响准确率)"""# seed:随机种子,是一个整数,当设置之后,每次生成的随机数都一样np.random.seed(116)  # 使用相同的 seed,保证输入特征和标签一一对应np.random.shuffle(self.x_data)np.random.seed(116)np.random.shuffle(self.y_data)tf.random.set_seed(116)def read_data_set(self):"""导入数据,分别为输入特征和标签"""self.x_data = datasets.load_iris().dataself.y_data = datasets.load_iris().targetif __name__ == "__main__":irises = ClassificationIrises()irises.run()

Tensorflow2.x框架-神经网络实现鸢尾花分类相关推荐

  1. 神经网络实现鸢尾花分类(Tensorflow2.0)

    1鸢尾花数据 回顾鸢尾花数据集,其提供了150组鸢尾花数据,每组包括鸢尾花的花萼长.花萼宽.花瓣长.花瓣宽 4个输入特征,同时还给出了这一组特征对应的鸢尾花类别.类别包括狗尾鸢尾.杂色鸢尾.弗吉尼亚鸢 ...

  2. [python] 深度学习基础------人工神经网络实现鸢尾花分类(一)

    ​​​​​​​人工神经网络实现鸢尾花分类(一) 人工神经网络实现鸢尾花分类(二) 人工神经网络实现鸢尾花分类(三) 人工神经网络实现鸢尾花分类(四) 人工神经网络实现鸢尾花分类(五) 目录 人工智能主 ...

  3. 神经网络实现鸢尾花分类

    神经网络实现鸢尾花分类 一.数据集介绍 共有数据150组,每组包括花萼长.花萼宽.花瓣长.花瓣宽4个输入特征. 同时给出了,这一组特征对应的鸢尾花类别.类别包括Setosa Iris(狗尾草 鸢尾), ...

  4. 猿创征文|深度学习基于前馈神经网络完成鸢尾花分类

    大家我是猿童学!这次给大家带来的是基于前馈神经网络完成鸢尾花分类! 在本实验中,我们使用的损失函数为交叉熵损失:优化器为随机梯度下降法:评价指标为准确率. 一.小批量梯度下降法 在梯度下降法中,目标函 ...

  5. 机器学习 | 使用TensorFlow搭建神经网络实现鸢尾花分类

    鸢尾花分类问题是机器学习领域一个非常经典的问题,本文将利用神经网络来实现鸢尾花分类 实验环境:Windows10.TensorFlow2.0.Spyder 参考资料:人工智能实践:TensorFlow ...

  6. 最简单的单层神经网络实现鸢尾花分类

    一,知识背景 鸢尾花的分类由四个数据定义,分别是花萼长.花萼宽.花瓣长.花瓣宽.我们把这样的一组数据称为是一组特征,根据特征可以分为三类鸢尾花. 二,神经元模型 神经元采用最简单的简化MP(麦卡洛克- ...

  7. 手写单隐层神经网络_鸢尾花分类(matlab实现)

    文章目录 思路 留言 效果 代码 mian split training testing 思路 sigmoid函数做激活函数 二分类交叉熵做损失函数 mian函数:数据预处理 split函数:数据集分 ...

  8. 【神经网络计算】——神经网络实现鸢尾花分类

    本blog为观看MOOC视频与网易云课堂所做的笔记 课堂链接: 人工智能实践:TensorFlow笔记 吴恩达机器学习 疑问与思考 为什么按照batch喂入数据 之前看的视频里面处理数据都是一次性将所 ...

  9. Python 基于BP神经网络的鸢尾花分类

    本文用Python实现了BP神经网络分类算法,根据鸢尾花的4个特征,实现3种鸢尾花的分类. 算法参考文章:纯Python实现鸢尾属植物数据集神经网络模型 2020.07.21更新: 增加了分类结果可视 ...

最新文章

  1. 小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下
  2. ImportError: No module named setuptools 解决方法
  3. HDU1576 A/B【扩展欧几里得算法+试探法】
  4. 使用argparse对python脚本时运行时添加参数
  5. 整合Solr到Tomcat服务器,并配置IK分词
  6. 计算机仿真的特点,计算机仿真的基本特点与基本流程.doc
  7. c++图书馆管理系统
  8. matlab一阶导数图,一阶微分excel【如何用EXCEL做一阶导数图?】
  9. 电音(2)8-bit
  10. JAVA中DateTime获取当前时间
  11. 将两个有序顺序表合并为一个新的有序顺序表MergeList_Sq
  12. 华为设备常见SNMP操作
  13. Spring Boot连接Oracle数据库驱动加载不上的问题(pom.xml引入ojdbc报错的问题)
  14. GOF 面向对象 23 种设计模式详解
  15. iOS- 本地文本容错搜索引擎2--如何实现英文(英文首字母,汉语拼音)对中文的搜索?...
  16. Java基础05-面向对象private\this\static关键字
  17. 2022年大二学生HTML期末作业,网页制作作业(我的校园网站制作)
  18. 红黑夜法官 c++(缺陷版)
  19. 公司企业邮箱有哪些好用的功能,邮件撤回怎么用?
  20. oracletns中不存在名称为_科比不会为黄蜂打球,你觉得科比能去骑士,不存在的...

热门文章

  1. Pacbio测序原理以及SMRT bell文库构建流程简述
  2. 桌面一片空白(不显示图标)的盗号木马清除指南
  3. android surfaceview 背景颜色,android – 设置Surface View的背景颜色
  4. 解决python.exe 无法找到程序入口,无法定位程序输入点
  5. EF Power Tool 参数错误 HRESULT:0x80070057 (E_INVALIDARG)) 解决办法
  6. MySQL性能问题以及查找和处理
  7. /etc/ssh/ssh_config line 59: Unsupported option “gssapiauthentication“
  8. 如何区别劳动合同和劳务派遣合同
  9. 32位系统和64的区别c语言,32位 与 64 位 区别 : CPU 操作系统 应用程序...
  10. ERD Online 4.0.3数据库在线建模(免费、更美、更稳定)