前言: 我们在搭建解决三好学生成绩问题的神经网络03神经网络循环500次中构建的三好学生神经网络模型更多的是从一般的思维方法来设计的,这与神经网络通常设计中的思路并不一致。现在我们对这个模型进行优化,让它的逻辑更加清晰、运行更加高效。基本概念:张量、向量、矩阵的相关概念请看Numpy简单的使用自由太阳的博客CSDN博客简述numpy的使用方法张量在tensorflow使用: 我们先看一段代码:从三好学生神经网络模型截取的部分代码,添加了几个print语句以便查看变量的取值。Author:北京QQ:838262020time:2021330导入TensorFlow包importtensorflowastf定义三个占位符,数据类型为浮点型x1tf。placeholder(dtypetf。float32)x2tf。placeholder(dtypetf。float32)x3tf。placeholder(dtypetf。float32)yTraintf。placeholder(dtypetf。float32)print(x1:sx1)定义三个可变参数,数据类型为浮点型w1tf。Variable(0。1,dtypetf。float32)w2tf。Variable(0。1,dtypetf。float32)w3tf。Variable(0。1,dtypetf。float32)print(w1:sw1)n1w1x1n2w2x2n3w3x3print(n1:sn1)yn1n2n3print(y:sy) 运行结果:x1:Tensor(Placeholder:0,dtypefloat32)w1:tf。VariableVariable:0shape()dtypefloat32refn1:Tensor(mul:0,dtypefloat32)y:Tensor(add1:0,dtypefloat32) 我们可以知道:x1是一个Tensor对象,Placeholder:0中的冒号后面数字代码该操作输出结果的编号,‘0’表示第一个输出结果编号,大多数情况下只有一个输出结果。typefloat32表示x1是一个float32(32位浮点数)数据类型。w1是一个tf。Variable对象(可变参数对象),它不是Tensorf对象n1是一个Tensor对象,是由mul:0操作而来的,mul是乘法(multiple)操作的简称,这个操作对应于n1x1w1表达式。y是一个Tensor对象,是由add1:0操作而来的,对应于yn1n2n3表达式。 我们通过上述可以知道,张量在程序中有两层含义:一、包含了对于输入数据的计算操作(给张量赋值时等号右边的表达式操作)二、容纳一个或者一组数据,也就是它的输出数据(在程序就是张量赋值语句左边的变量) 用向量重新组织输入数据 如果现在要在三好学生中添加一个艺术分数,那么在神经网络的输入成添加一个x4节点,隐藏层添加一个n4节点。即输入数据改变时,整套逻辑没有改变,也要修改整个网络模型,这样太过于复杂。在神经网络中更多的是一串的数据组成的。如三好学生的三个分数可以用数组【90,80,70】来表示。我们把每一列称为一维,三好学生的三个分数称为一个三维向量。简化后的代码实现:Author:北京QQ:838262020time:2021330导入TensorFlow包importtensorflowastf定义占位符,数据类型为浮点型xtf。placeholder(shape〔3〕,dtypetf。float32)yTraintf。placeholder(shape〔〕,dtypetf。float32)定可变参数,数据类型为浮点型wtf。Variable(tf。zeros(〔3〕),dtypetf。float32)nwxytf。reducesum(n)lossabs(yyTrain)optimizertf。train。RMSPropOptimizer(0。001)trainoptimizer。minimize(loss)会话对象sesstf。Session()初始化可变参数inittf。globalvariablesinitializer()sess。run(init)输出要查看的变量和喂数据foriinrange(5000):result1sess。run(〔train,x,y,yTrain,loss〕,feeddict{x:〔90,80,70〕,yTrain:85})print(result1)result2sess。run(〔train,x,y,yTrain,loss〕,feeddict{x:〔98,95,87〕,yTrain:96})print(result2) 通过上面的代码我们可以看见:原来的输入节点变量x1,x2,x3x1tf。placeholder(dtypetf。float32)x2tf。placeholder(dtypetf。float32)x3tf。placeholder(dtypetf。float32) 改成了一个3维的向量存入变量x:xtf。placeholder(shape〔3〕,dtypetf。float32) 原来的可变参数w1,w2,w3:定义三个可变参数,数据类型为浮点型w1tf。Variable(0。1,dtypetf。float32)w2tf。Variable(0。1,dtypetf。float32)w3tf。Variable(0。1,dtypetf。float32) 改成了一个3维向量w,tf。zeors(〔3〕)表示的是一个3维向量元都为零,即〔0,0,0〕。wtf。Variable(tf。zeros(〔3〕),dtypetf。float32) 原本的yTraintf。placeholder(dtypetf。float32)是一个普通数字,因此我们只需要添加shape〔〕,即yTraintf。placeholder(shape〔〕,dtypetf。float32) 隐藏层节点n1,n2,n3也简化成n;nwx 现在的ytf。reducesum(n)代替了yn1n2n3,即tf。reducesum函数的作用是把作为它的参数的向量(矩阵)中的所有维度的值相加求和。 概念补充标量、多维数组、张量等标量:普通的一个数字,可以是整数或者浮点数(小数)多维数组:对应数学中的矩阵,如两个学生的分数分别为90,80,70和98,95,87,用矩阵表示编辑,称做2x3的矩阵。张量的阶和形态:张量主要用来存放节点的输出数据的,其中存放的数据可以是一个标量,也可以是一个向量(一组数),还可以是一个矩阵(二维的数组),甚至可以是用多维数组来表达的数据。TensorFlow中用形态(shape)来表达在张量中存储的数据的形态。 注意: 不要把向量的维度和数组的维度混淆。向量中,我们把向量中有几个数字,我们把它叫作几个维度,其中每一个数字叫作一维。在多维数组中,除了最后一维是一个一维数组外,其他每一维都是包含数组作为内容项的,并且维度越高,包含的内容项的维度也越高,比如,二维数组的第一维包含的内容项都是一维数组,而三维数组包含的内容项都是一个个二维数组。如〔〔〔90,80,70〕,〔98,95,87〕〕,〔〔88,90,63〕,〔93,94,34〕〕〕,这个三维数组可以用来表示两个班级学生的成绩,也就是说在‘学生’和‘分数类型(德育、智育,体育)’的基础上,引入了班级的维度作为第一个维度。第一个维度包含两个班级,第二个维度是每个班级包含两个学生,第三个维度包含3个数组;这个三维数组可以称为2x2x3的三维数组。在TensorFlow中查看和设定张量的形态Author:北京QQ:838262020time:2021331importtensorflowastfxtf。placeholder(dtypetf。float32)xShapetf。shape(x)sesstf。Session()标量的形态resultsess。run(xShape,feeddict{x:8})print(result)向量的形态resultsess。run(xShape,feeddict{x:〔3,4,5〕})print(result)向量的形态resultsess。run(xShape,feeddict{x:〔〔3,4,5〕,〔2,3,4〕〕})print(result) 运行结果〔〕〔3〕〔23〕 softmax函数规范可变参数 根据三好学生的计算公式:总分德育分0。6智育分0。3体育分0。1,我们可以看出三个权重之和为1。根据权重之和为1这个规则,我们可以使用这个规则大大减小优化器调整可变参数的工作量。Author:北京QQ:838262020time:2021330导入TensorFlow包importtensorflowastf定义占位符,数据类型为浮点型xtf。placeholder(shape〔3〕,dtypetf。float32)yTraintf。placeholder(dtypetf。float32)定可变参数,数据类型为浮点型wtf。Variable(tf。zeros(〔3〕),dtypetf。float32)wntf。nn。softmax(w)nxwnytf。reducesum(n)lossabs(yyTrain)optimizertf。train。RMSPropOptimizer(0。1)trainoptimizer。minimize(loss)会话对象sesstf。Session()初始化可变参数inittf。globalvariablesinitializer()sess。run(init)输出要查看的变量和喂数据foriinrange(5):result1sess。run(〔train,x,w,wn,y,yTrain,loss〕,feeddict{x:〔90,80,70〕,yTrain:85})print(result1〔3〕)result2sess。run(〔train,x,w,wn,y,yTrain,loss〕,feeddict{x:〔98,95,87〕,yTrain:96})print(result2〔3〕) 运行结果:〔0。333333340。333333340。33333334〕〔0。413998010。327278320。25872371〕〔0。449920。328194050。22188595〕〔0。528471890。29058680。18094125〕〔0。55933630。280439050。1602246〕〔0。631813940。234697510。13348855〕〔0。65760130。222040980。12035771〕〔0。593037780。266266410。14069577〕〔0。61907250。253823610。12710389〕〔0。682496910。209636390。1078667〕 我们可以看见wn三个数之和一直为1。三好学生模型是典型的线性问题,线性问题是神经网络中最简单的一类。我们的问题符合ywx或者(ywxb)。