简洁明了的tensorflow2.0教程——实现鸢尾花分类

2024-03-21 11:50

本文主要是介绍简洁明了的tensorflow2.0教程——实现鸢尾花分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过本文你可以学会神经网络最基本的用法,可以对tensorflow用法有初步的了解,实现神经网络入门,适用于有着在机器学习/或者深度学习有着理论基础,拥有一定python编程基础但是对神经网络实践缺少经验的coder,通过阅读并且自己完成本篇博客中的代码小白也能学会如何利用神经网络来实现简单的分类任务。这一讲源码在我的github,地址:https://github.com/JohnLeek/Tensorflow-study,源码文件为day1_iris_classfiction.py,觉得不错可以给个Star。

一、环境配置

这里需要用到的第三方包有numpy,pandas,matplotlib,sklearn,注意的是tensorflow用的是2.0版本,不涉及图像GPU和CPU版本随意选择,读者可先用pip命令安装好所需要的包,tensorflow2.0的安装配置见我这篇博客,https://blog.csdn.net/JohnLeeK/article/details/104508885,开发工具选择pycharm,pycharm中配置tensorflow运行环境可以参考我的这篇matplot配置博客,https://blog.csdn.net/JohnLeeK/article/details/99582355,大同小异,也可自行百度解决。

二、鸢尾花数据集展示与说明

废话不多说直接进入正题,首先我们看一下鸢尾花数据集的结构

敲入如下代码:

from sklearn import datasets
from pandas import DataFrame
import pandas as pd
#.data返回特征值
x_data = datasets.load_iris().data
#.target 返回标签
y_data = datasets.load_iris().target
print("x_data from datasets: \n",x_data)
print("y_data from datasets: \n",y_data)x_data = DataFrame(x_data,columns=['花萼长度','花萼宽度','花瓣长度','花瓣宽度'])
pd.set_option('display.unicode.east_asian_width',True)x_data['类别'] = y_data
print("x_data add a column: \n",x_data)

结果:

可知数据集提供了死个鸢尾花属性,分别为花萼长度、花萼宽度、花瓣长度、花瓣宽度,0,1,2分别对应不同的鸢尾花品种。到这里我们就可以设计出来本次鸢尾花分类的神经网络模型,输入层4个神经元对应鸢尾花数据集的4个特征,输出层3个神经元对应鸢尾花的3个分类。

好了有了数据集的准备,并且我们也搭建出来了简单的神经网络模型(不包括偏置神经元,通常在设计神经网络时会忽略,bias)。

三、本次实验中用到的函数介绍

1、tf.cast

tf.cast(data,tf.float32)

这个函数用于将我们的数据转化为可供tensorflow训练和测试使用的张量(Tensor),通常我们读取的数据为numpy格式或者是python自带的数据形式,但是在喂入神经网络的时候需要做转化,使用cast函数即可,data为我们要转化的数据,tf.float32为转化之后的数据类型。

2、tf.data.Dataset.from_tensor_slices

tf.data.Dataset.from_tensor_slices(tensor1,tensor2)

这个函数会将我们的训练接Tensor1和tensor2做标签对应关系,以方便神经网络训练,注意tensor1和tensor2维度必须相同。

3、tf.Variable

tf.Variable(initial_value=None, trainable=None, validate_shape=True, caching_device=None,name=None, variable_def=None, dtype=None, import_scope=None, constraint=None,synchronization=tf.VariableSynchronization.AUTO,aggregation=tf.compat.v1.VariableAggregation.NONE, shape=None)

这里我们只使用initial_value,这个函数会将我们传入的tensor或者数标记为“可训练”,可以在训练的过程中更新我们传入的参数。

4、tf.random.truncated_noaml

tf.random.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32, seed=None, name=None)

shape参数指定我们生成的神经元形状用list传入,如[4,3]指定生成4的神经元,3为输出,mean为生成随机数的中指,stddev为方差,seed为随机数种子。

5、tf.GradientTape

tf.GradientTape(persistent=False, watch_accessed_variables=True)

该函数可实现参数的自动求导

6、tf.matmual

该函数实现了tensor的乘法

7、tf.nn.softmax

tf.nn.softmax(logits, axis=None, name=None)

神经网络最后的输出为矩阵的形式,为了获得我们期待的形式我们使用softmax让输出符合概率分布

8、tf.one_hot

tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)

将标签转化为独热码性质,注意depth,这里指定分类,鸢尾花分类是3,所以depth=3

9、gradient

配合tf.GradientTape使用,实现参数的求导

10、assign_sub

实现参数自更新

四、正式开始工作

导入我们要用到的模块:

import tensorflow as tf
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np

刚才我们已经看过鸢尾花数据集结构了,现在我们导入数据集

x_data = datasets.load_iris().data
y_data = datasets.load_iris().target

首先官方给出的数据集是有顺序的,所以我们需要打乱数据集顺序,如同我们人认识这个世界的时候一样,知识都是杂乱无章的涌入我们大脑的,避免陷入局部最优解,可以获得更高的分类准确率。

###seed为随机种子,保证每次生成的随机数一样
###方便你得到的结果和我一样
np.random.seed(116)
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)

这样我们就保证了数据集的乱序,而且乱序用的seed是一样的,所以都有同样的顺序。

接下来我们拆分数据集和训练集,指定前120组数据为训练集,剩余的30组数据为测试集,通常训练集大小为总数据集大小的60%--70%。

x_train = x_data[:-30]
y_train = y_data[:-30]x_test = x_data[-30:]
y_test = y_data[-30:]

tensorflow中一般默认数据类型为float32,但是我们读入的数据可能不是,所以我们做一下强制类型转换,保证数据的类型统一。

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

我们要实现输入数据就能得到对应的输出,还需要将特征值和标签匹配。

'''
匹配输入特征还有标签
batch为喂入神经神经网络每组数据大小
'''
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)

这里batch为喂入神经网络的数据集大小,我们设置为32,这样就是分四次喂入神经网络。完成了基本准备工作后,我们就开始利用tensorflow搭建神经网络。

'''
搭建神经网络,4个特征值,输入层为4个神经元;3分类,所以输出层为3个神经元
seed保证生成的随机数相同,实际项目不需要
Variable标记训练参数
'''
w1 = tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,seed=1))
b1 = tf.Variable(tf.random.truncated_normal([3],stddev=0.1,seed=1))

接下来我们设置学习率,和迭代次数

lr = 0.1#学习率
train_loss_result = []#记录每轮训练之后的loss
test_acc = []#模型准确度
epoch = 500#每轮训练次数
loss_all = 0#每轮分为4step,记录四个step生成的4个loss和
神经网络训练部分

神经网络训练部分

for epoch in range(epoch): #数据集别循环每个epoch遍历一次数据集for step,(x_train,y_train) in enumerate(train_db): #batch级别循环,每个step循环一个batchwith tf.GradientTape() as tape: #梯度下降求得参数值y = tf.matmul(x_train,w1) + b1 #函数表达式 y = xw + by = tf.nn.softmax(y)#使输出符合概率分布y_ = tf.one_hot(y_train,depth = 3)#将标签转化为独热码,方便求loss和accuracyloss = tf.reduce_mean(tf.square(y_-y))#采用均方误差损失函数mes = mean(sum(y-out)^2)loss_all += loss.numpy()#将每个step计算得出的loss累加,为后续求loss平均值提供数据#计算w1和b1梯度grads = tape.gradient(loss,[w1,b1])#更新梯度w1.assign_sub(lr*grads[0])b1.assign_sub(lr*grads[1])#每个epoch打印下lossprint("Epoch: {},loss: {}".format(epoch,loss_all/4))#保存每个step的平均值train_loss_result.append(loss_all/4)

训练完成之后我们便可以验证模型准确率了。

'''
total_correct为预测正确的样本个数
total_number为测试样本总数
'''
total_correct,total_number = 0,0
for x_test,y_train in test_db:y = tf.matmul(x_test, w1) + b1y = tf.nn.softmax(y)pred = tf.argmax(y, axis=1)  # 返回y中的最大值索引,即预测分类# 将pred转化为y_test数据类型pred = tf.cast(pred, dtype=y_test.dtype)# 如果分类正确,correct = 1 否则为0,将bool类型结果转化为intcorrect = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)# 将每个batch的correct数加起来correct = tf.reduce_sum(correct)# 将所有batch中的correct加起来total_correct += int(correct)# total_number为测试的总样本数,即x_test的行数,shape[0]返回行数total_number += x_test.shape[0]
# 计算准确率
acc = total_correct / total_number
test_acc.append(acc)
print("Test_acc:", acc)
print("这是一条分割线------------------********************++++++++++++++++++")

结果可视化:为了方便我们观察模型训练结果我们使用matplotlib将准确率还有损失函数更新情况绘制成图片。

#绘制loss曲线
plt.title("Losss Function Curve")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.plot(train_loss_result,label="$Loss$")# 逐点画出trian_loss_results值并连线,连线图标是Loss
plt.legend()
plt.savefig("./loss")#绘制Accuracy曲线
plt.title("Acc Curve")
plt.xlabel("Epoch")
plt.ylabel("Acc")
plt.plot(test_acc,label="$Accuracy$") # 逐点画出test_acc值并连线,连线图标是Accuracy
plt.legend
plt.savefig("./acc")

五、结果展示

从图中可以看出在我们完成500轮训练之后,分类准确率达到了100%,总的来说模型准确率不错,接下来看看绘制的Accuracy和Loss曲线。

可以看到在200轮左右模型基本得到了最优解,Loss也是一直下降,至此我们的第一个深度学习模型就已经搭建完毕。随后的博客中我会持续更新tensorflow2.0学习笔记,从简单的神经网络到CNN到RNN再到GAN。如果你觉得我的博客对你有帮助,别忘记点赞,你的点赞是我更新的动力!本节源码github地址:https://github.com/JohnLeek/Tensorflow-study,源码文件为:day1_iris_classfiction.py,觉得不错可以给个Star。

这篇关于简洁明了的tensorflow2.0教程——实现鸢尾花分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832566

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import