利用Tensorflow实现三层全连接的神经网络

1.Tensorflow的概述原理:

tensorflow的使用类似于一种框架定义,在使用tensorflow定义变量variable,和占位符tensorflow.placeholder()的时候,给出的是一种框架的定义。只有在会话控制模块tensorflow.session中调用run(),才能让对应的语句真正的执行。

这里关于tensorflow有一个很重要的计算图的概念,意思就是在你声明的一些框架变量之后,对变量的相关计算操作都会被连接,绘制成一个计算图,叶子结点就是你声明的一些参数变量,也是你最后要进行优化的参数,在计算图绘制完成之后,在会话控制模块对计算图的根节点进行反向追踪,才能对变量进行优化,计算图的构造是自然而然的,不需要程序员操心,这只是一个概念

这里我们基于sklearn中的莺尾花数据集进行三层全连接的神经网络搭建,数据集的导入不做详细介绍

第一步:因为我们要进行分类模型的训练,首先我们需要利用tensorflow的one_hot()独热编码函数,将数据集的label集编码成为对应编码集。one_hot()中有两个核心的参数要传入,第一个就是待编码的列表格式的label集,第二个就是depth(也就是数据集是几分类就传几)。需要注意的是,这里的独热编码对象是一个列表!!!是一个列表!!列表!!重要的说三遍,函数会对传入的列表的每一个元素进行编码,如果是三分类且label为2的话就是[0,0,1]。

第二步:我们需要定义我们计算要的参数

1.输入集,input=tensorflow.placeholder(dtype,shape),两个参数分别是你输入集的元素的数据类型是什么,和输入集的维度是什么,如果shape=[None,4],None表示该维度是任意的。这里注意你的dtype在进行后面的矩阵乘法的时候要和权重相一致

2.声明权重:输入层到隐含层权重声明为V=tensorflow.variable(),隐含层到输出层权重声明为W=tensorflow.variable(),函数参数是放入你要成为变量的tensor,注意tensorflow的变量默认的数据类型是float32,并且,能成为变量的都是后面我们需要进行优化的神经网络参数,不是啥都放入变量里面去

第三步:通过定义的参数变量构造一个到损失函数的计算图

3.进行前向计算,输出层的predict经过tensorflow.matmul(input,v),在经过一个激活函数,在和W进行矩阵相乘运算,在经过一个激活函数,也可以不经过输出predict。此时已经以input,V和W为叶子结点构造了一个到达predict的计算图,

4.在定义一个损失函数loss,最后选择一个优化器,这里我们选择的是tensorflow.train中的梯度下降优化器,最后利用优化器的minimum(loss,var_grad=[])最小化损失函数,注意,这里有一个很重要的参数var_gard,这里就是传入你要进行梯度下降更新的变量都有哪些,可以通过列表传入,minimum()封装了求解梯度,自动更新梯度的工作。

第四步:写会话控制模块,一般利用with tensorflow.Session() as sess:开头进入会话模块,里面调用sess.run(loss),sess.run(优化器工作)等等来执行框架语句。注意!!注意!!这里的sess.run()只是启动语句的执行,它是可以返回执行完的结果的,一般我们把要继续分析的数据计算出来之后要放到一个正常的python变量里面去,如果没有保存下来,就只是单纯的执行了一下语句而已,没有任何效果。

最后我们在一个for循环里面执行一定次数的sess.run(优化器工作)的语句就可以实现很好的参数权重优化了。

Original: https://blog.csdn.net/For_Future_l/article/details/124281504
Author: For_Future_l
Title: 利用Tensorflow实现三层全连接的神经网络

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/690916/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球