tensorflow从入门到搭建学习模型 您所在的位置:网站首页 web的应用 tensorflow从入门到搭建学习模型

tensorflow从入门到搭建学习模型

#tensorflow从入门到搭建学习模型| 来源: 网络整理| 查看: 265

0、安装tensorflow 安装方法并不困难,只需要按照tensorflow官网https://www.tensorflow.org/install/(中文显示)的指导完成就行。有各个操作系统下的安装指导。 大致分为以下步骤

1、安装python3(更推荐直接安装包括了python3基本库以及多个科学计算库"numpy、sklearn等"的Anaconda) 2、在Anaconda里面再下载安装tensorflow(34MB左右大小) 3、tensorflow分为普通版和GPU版,若有GPU则应安装GPU版。

1、从名字理解tensorflow tensor 即张量的意思,也可以理解为我们常见的矩阵,但每一个tensor是一个实例对象。矩阵里面有很多由同一个基本数据类型组成的数据元素。所以tensor可以理解为tensorflow这种学习框架最常用的一种数据类型。 flow 即流动的意思。 tensor+flow 意为矩阵形式的数据在流动,流动就会产生变化。所以tensorflow的目的就是让矩阵形式的数据经过一系列矩阵变换,得到我们想要的矩阵。 2、tensor是怎么flow的?数据在哪里流动?数据流动过程中怎么发生变化?

graph

图,地图,流程图,计算图。类似现实中的黄河流域图,在图中能看到多个节点和路线。有多个地方有水流入黄河主干也有多个地方有水流出。黄河的水在经过各个节点后颜色有变化,黄河的源头在青藏高原,水很清澈,在流经兰州后变黄,然后在流经银川到陕西、山西、河南洛阳这一带水特别浑浊污染严重,最后流入海洋的水也早已经不是源头的清水。 黄河流域图.jpg tensorflow的数据流动过程图.gif

tensor数据就是在类似下面这样的图中流动。 计算图 图中tensor如何发生变化? w、x和b就是3个不同的tensor矩阵数据,作为输入节点——input tensor MatMul、Add和ReLU,是3个计算节点,分别代表3个对矩阵的不同的操作,就是这些操作使得tensor数据发生变化——operator C是由3个输入矩阵经过一系列变化后的输出数据——output tensor 3、我们要怎么运行tensorflow?

tensorflow的运行流程主要有2步,分别是构建模型和运行模型。

3.1、构建模型 在构建模型阶段,我们需要通过代码构建一个图来描述我们的模型。所谓图,可以理解为流程图,就是将数据的输入节点->中间处理节点->输出节点整个流程用代码表示出来。并为每个节点命名,以便我们可以通过名字来访问这些节点。 例如,要构建下图中的模型,那表达式就是

Y=W*X+b ————W为权重矩阵,b为偏差 C=ReLU(Y) ————激活函数ReLU:yi=max(0,yi),即矩阵Y中负数全替换为0

计算流程图Graph 构建模型的代码如下: import tensorflow as tf import numpy as np # 计算图,不加这一行也会提供一个默认图 myGraph = tf.get_default_graph() # 多个tensor数据节点 X = tf.placeholder(name="input", shape=[2, 1], dtype=tf.int32) W = tf.get_variable(name="weight", shape=[2, 2], dtype=tf.int32, initializer=tf.constant_initializer([[-1, 1], [-1, -1]])) b = tf.get_variable(name="bias", shape=[2, 1], dtype=tf.int32, initializer=tf.constant_initializer([1, 1])) # 多个operation操作节点 Y = tf.matmul(W, X) + b C = tf.nn.relu(Y)

上面的模型Y=W*X+b 就是构成神经网络的基础——神经元。函数f(⋅)也被称为是神经元的激活函数。一定是带有激活函数的才是一个神经元。 神经元

上面的一层神经网络模型 一层神经网络 一般构建两层就可以认为是一个神经网络,更多层就可以认为是深度神经网络也就是深度学习。

——两层神经网络,隐藏层就是指除输入层和输出层外的所有中间层,中间层的数据一般是不用关心的,所以叫隐藏层(或隐含层,类似黑盒子)。一般输入层数据X都认为是一个神经元,而x1,x2,x3,xn这些只是一个输入X的不同维度的数据,或者不当做神经元。中间隐含层的每层多个圆表示多个神经元。 两层神经网络图.jpg

——普通的多层神经网络又叫多层感知机 多层感知机.jpg ——卷积神经网络,某些神经元的输入信息只和部分前一层输出神经元有关。 卷积神经网络图.jpg ——循环神经网络,某些神经元的输入信息,不仅包括前一层的输出,还包括它自身先前状态。也就是引入了时间上的循环,有记忆功能。 循环神经网络.jpg 3.2运行模型 模型也可以理解为模板,是抽象的。只能在给这个模板输入不同的X,得到不同的Y和C时,才能称为一次模板的实现。为了区分不同的模板实现,tensorflow引入了session来控制。 session即会话的意思,常用在网络通信协议中表示一个会话控制对象,session 对象存储特定用户会话所需的属性及配置等信息。

如果不使用session,直接打印tensor只能看到对象信息,看不到具体的数据,如下代码打印结果: 未使用session 在session内run运行这些tensor节点才能看到具体的数据,而且所有的operation操作节点也必须在session内run才能执行。 import tensorflow as tf import numpy as np # 计算图,不加这一行也会提供一个默认图 myGraph = tf.get_default_graph() # 多个tensor hello = tf.constant("hello world !") X = tf.placeholder(name="input", shape=[2, 1], dtype=tf.int32) W = tf.get_variable(name="weight", shape=[2, 2], dtype=tf.int32, initializer=tf.constant_initializer([[-1, 1], [-1, -1]])) b = tf.get_variable(name="bias", shape=[2, 1], dtype=tf.int32, initializer=tf.constant_initializer([1, 1])) # 操作operation Y = tf.matmul(W, X) + b C = tf.nn.relu(Y) print("打印tensor:") print(hello) print(X) print(W) # 开始运行计算图 sess = tf.Session() # 必须先初始化所有变量,并分配内存 sess.run(tf.global_variables_initializer()) print(sess.run(hello)) print("W=", sess.run(W)) # 注意,用tensorflow产生的tensor只是一个类实例对象, # 必须在执行run之后才能变成实际的矩阵 # x_matrix = tf.ones(shape=[2, 1], dtype=tf.int32) x_matrix = np.reshape([1, 1], (2, 1)) print("X=\n",x_matrix) print("b=\n", sess.run(b)) # 给定输入值 x_input = myGraph.get_tensor_by_name("input:0") print("Y=W*X+b=\n", sess.run(Y, feed_dict={x_input: x_matrix})) print("C=ReLU(Y)=\n", sess.run(C, feed_dict={X: x_matrix})) sess.close()

输出结果如下: 使用session 矩阵运算 4、怎么用tensorflow来做一个机器学习模型? 主要分为以下四个步骤: 前向传播:模型训练,得到输出结果与实际结果的误差(损失)值loss

1、构建模型 2、设计损失函数loss

反向传播:目的是通过优化函数,如梯度下降法去反向调整模型的变量——权重矩阵W和偏置b,使得loss函数取得最小值

设计优化函数

训练模型:用更新的W和b再次进行训练,得到新的loss。设计循环重复进行训练,希望得到满意的loss,当然也可能模型设计的有问题得不到loss最小值。 保存和使用模型:也就是保存变量W和b的值。在用于预测时加载这个模型,就可以得到分类结果。 代码如下: import tensorflow as tf import numpy as np # 计算图,不加这一行也会提供一个默认图 myGraph = tf.get_default_graph() # 训练得到的模型保存的地址 model_path = "D:/src/ML_DL/models/model.ckpt" # 多个tensor hello = tf.constant("hello world !") X = tf.placeholder(name="input", shape=[2, 1], dtype=tf.float32) W = tf.get_variable(name="weight", shape=[2, 2], dtype=tf.float32, initializer=tf.constant_initializer([[1, 1], [1, 1]])) b = tf.get_variable(name="bias", shape=[2, 1], dtype=tf.float32, initializer=tf.constant_initializer([0, 0])) target = tf.placeholder(name="lables", shape=[2, 1], dtype=tf.float32) # 1、构建模型 Y = tf.matmul(W, X) + b # 2、损失函数,简单设计为均方误差的求和 err = 0.5*(Y - target)**2 loss = tf.reduce_sum(err) # 3、优化函数,梯度下降法去求使得loss函数有最小值的最优的W和b # 参数0.1是学习率,可以控制每次下降的速度 back_transfer = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 提供输入值x和对应的目标值 x_matrix = np.reshape([0.9, 1.1], (2, 1)) target_matrix = np.reshape([1, 1], (2, 1)) accuracy = (1-loss)*100.0 # 查看系统自动分配的tensor名字,如果自己不设定name的话 print(Y) # 开始运行计算图 sess = tf.Session() # 必须先初始化所有变量,并分配内存 sess.run(tf.global_variables_initializer()) print(sess.run(hello)) for i in range(20): print("=======第%d次训练====================" % (i+1)) print("W=\n", sess.run(W)) print("X=\n", x_matrix) print("b=\n", sess.run(b)) x_input = myGraph.get_tensor_by_name("input:0") print("Y=W*X+b=\n", sess.run(Y, feed_dict={x_input: x_matrix})) print("target=\n", target_matrix) print("err = 0.5*(Y - target)**2=\n", sess.run(err, feed_dict={X: x_matrix, target: target_matrix})) print("loss=\n", sess.run(loss, feed_dict={X: x_matrix, target: target_matrix})) acc = sess.run(accuracy, feed_dict={X: x_matrix, target: target_matrix}) print("预测准确度= %", acc) # 可以在适当的时候保存模型,并结束训练 if acc > 99.5: saver = tf.train.Saver() saver.save(sess, model_path) break # 执行反向传递,根据梯度下降法来更新变量——权重W和偏差b sess.run(back_transfer, feed_dict={X: x_matrix, target: target_matrix}) sess.close()

程序运行结果:

Tensor("add:0", shape=(2, 1), dtype=float32) b'hello world !' =======第1次训练==================== W= [[1. 1.] [1. 1.]] X= [[0.9] [1.1]] b= [[0.] [0.]] Y=W*X+b= [[2.] [2.]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.5] [0.5]] loss= 1.0 预测准确度= % 0.0 =======第2次训练==================== W= [[0.91 0.89] [0.91 0.89]] X= [[0.9] [1.1]] b= [[-0.1] [-0.1]] Y=W*X+b= [[1.6980001] [1.6980001]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.24360205] [0.24360205]] loss= 0.4872041 预测准确度= % 51.279594 =======第3次训练==================== W= [[0.84718 0.81321996] [0.84718 0.81321996]] X= [[0.9] [1.1]] b= [[-0.16980001] [-0.16980001]] Y=W*X+b= [[1.4872038] [1.4872038]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.11868379] [0.11868379]] loss= 0.23736759 预测准确度= % 76.263245 =======第4次训练==================== W= [[0.8033317 0.7596275] [0.8033317 0.7596275]] X= [[0.9] [1.1]] b= [[-0.2185204] [-0.2185204]] Y=W*X+b= [[1.3400683] [1.3400683]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.05782324] [0.05782324]] loss= 0.115646474 预测准确度= % 88.43535 =======第5次训练==================== W= [[0.7727255 0.72222 ] [0.7727255 0.72222 ]] X= [[0.9] [1.1]] b= [[-0.25252724] [-0.25252724]] Y=W*X+b= [[1.2373676] [1.2373676]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.0281717] [0.0281717]] loss= 0.05634339 预测准确度= % 94.36566 =======第6次训练==================== W= [[0.75136244 0.69610953] [0.75136244 0.69610953]] X= [[0.9] [1.1]] b= [[-0.276264] [-0.276264]] Y=W*X+b= [[1.1656828] [1.1656828]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.01372539] [0.01372539]] loss= 0.027450787 预测准确度= % 97.25492 =======第7次训练==================== W= [[0.73645097 0.6778844 ] [0.73645097 0.6778844 ]] X= [[0.9] [1.1]] b= [[-0.2928323] [-0.2928323]] Y=W*X+b= [[1.1156465] [1.1156465]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.00668705] [0.00668705]] loss= 0.013374109 预测准确度= % 98.66259 =======第8次训练==================== W= [[0.7260428 0.6651633] [0.7260428 0.6651633]] X= [[0.9] [1.1]] b= [[-0.30439693] [-0.30439693]] Y=W*X+b= [[1.0807211] [1.0807211]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.00325795] [0.00325795]] loss= 0.0065159025 预测准确度= % 99.34841 =======第9次训练==================== W= [[0.7187779 0.656284 ] [0.7187779 0.656284 ]] X= [[0.9] [1.1]] b= [[-0.31246904] [-0.31246904]] Y=W*X+b= [[1.0563436] [1.0563436]] target= [[1] [1]] err = 0.5*(Y - target)**2= [[0.0015873] [0.0015873]] loss= 0.0031745962 预测准确度= % 99.68254 Process finished with exit code 0 反向传播,梯度下降法优化函数推导过程 反向传播数学推导1 反向传播数学推导2

上图中η为学习率,控制每次下降的速度

第9次训练就结束了 保存的模型 5、使用训练好的模型做预测 使用保存好的模型 代码如下: import tensorflow as tf import numpy as np # 测试刚才保存的模型的变量是不是我们最后训练得到的 sess = tf.Session() saver = tf.train.import_meta_graph("D:/src/ML_DL/models/model.ckpta") saver.restore(sess, tf.train.latest_checkpoint("D:/src/ML_DL/models/")) graph2 = tf.get_default_graph() weight = graph2.get_tensor_by_name("weight:0") bias = graph2.get_tensor_by_name("bias:0") print("weight=\n", sess.run(weight)) print("bias=\n", sess.run(bias)) # 输入相同的X值,查看输出Y是否与之前的一样 input_x = graph2.get_tensor_by_name("input:0") x_value = np.reshape([0.9, 1.1], (2, 1)) output_y = graph2.get_tensor_by_name("add:0") print("Y=\n", sess.run(output_y, feed_dict={input_x: x_value})) sess.close()

更详细的总结博客:https://blog.csdn.net/ztf312/article/details/72722184



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有