本章强烈建议和 lesson 4 一起学习
一、什么是模型?
TensorFlow计算模型 = 计算图
计算图的概念:
TensorFlow的名字中已经说明了最重要的两个概念——Tensor(张量)和Flow(流)。TensorFlow是通过一个计算图的形式来表达计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的依赖关系。如果一个运算的输入依赖于另一个运算的输出,那么两个运算有依赖关系。
下图中,a和b两个常量不依赖任何其他计算,add计算则依赖读取两个常量的取值。所以在下图中就得到一条从a到add的边和从b到add的边。没有任何计算依赖add节点,所以add节点没有指向其他节点的边。TensorFlow的程序都可以通过类似下图所示的计算图形式来表示。
计算图的使用
TensorFlow 程序一般可以分为两个阶段:
- 第一个阶段需要定义计算图中所有的运算;
- 第二个阶段为执行运算
二、模型是如何诞生的?
1、模型内容的基本意义:
标准的模型有输入、节点、输出三个部分,如何让这三个部分连通起来学习规则并可以进行计算,这就是Tensorflow所做的事情。
Tensorflow将中间节点以及节点之间的运算关系(OPS)定义这计算图上,只通过会话(session),进行具体运算。
- 计算图是静态的,无论定义什么运算,它们只是将关系搭在一起,不会进行运算。
- 会话 是动态的,只有启动会话后才会将数据流向计算图中,按照图中的关系,最终结果从计算图中流出。
Tensorflow 分离的计算的 定义 和 执行 。
构建一幅计算图,需要:
- 输入节点,即图的入口
- 用于训练中的模型参数(学习参数),是连接各个节点的路径
- 模型中的节点(OP):OP可以代表模型中的中间节点,是网络中的真正结构。
这三种结构组成计算图的静态网络结构模型。在实际开发过程中,通过动态的会话将图中的各个节点按照静态的规则联系起来,每一次迭代都会对图中的学习参数(比如 权重 w 和 偏置 b ) , 通过一定的迭代后所形成的计算图,便是可以使用的模型。
在会话中,任何一个节点都可以通过会话的run函数进行计算,得到该节点的数值。
2、模型内部的数据流向:
- 正向
正向,则是数据从输入开始,依次进行各节点的运算,最后得到输出,是模型最基本的数据流向。 - 反向
反向只有在训练的场景下,才会用到。
即先从正向的最后一个节点开始,计算此时 结果 和 真实值 的误差,这样会形成一个用学习参数表示误差的方程,比如 梯度下降方法: 会对方程中的每个参数进行求导,得到梯度修正值,同时修正权重等学习参数,然后反推出上一层的误差,并接着计算上一层的修正值,直到传到正向的第一个节点。
三、Tensorflow开发基本步骤:
- 定义tensorlfow输入节点
- 定义 学习参数 的变量
- 定义运算
- 优化函数
- 初始化变量
- 迭代更新到最优解
- 测试模型
- 使用模型
四、基本开发步骤讲解:
1、定义输入节点:
- 通过占位符定义:
由placeholder方法创建,其也是一种常量,但是由用户在调用run方法是传递的,也可以将placeholder理解为一种形参。即其不像constant那样直接可以使用,需要用户传递常数值.
tf.placeholder(dtype=tf.float32, shape=[144, 10], name='X')
- 参数:
- dtype:数据类型,必填,默认为value的数据类型,传入参数为tensorflow下的枚举值(float32,float64…)
- shape:数据形状,选填,不填则随传入数据的形状自行变动,可以在多次调用中传入不同形状的数据
- name:常量名,选填,默认值不重复,建议根据创建顺序为(Placeholder,Placeholder_1,Placeholder_2…)
- 通过字典定义:
比如:
inputDict = {"x":tf.placeholder(tf.float32)}
- 直接定义输入节点(用的比较少)
比如:
train_X = np.linspace(-1,1,100)
2、定义 学习参数 的变量:
- 直接定义:
比如:
w = tf.Variable(tf.random_normal([1]),name="weight")
- 通过字典定义:
比如:
paradict = {
"w":tf.Variable(tf.random_normal([1])),
"b":tf.Variable(tf.zeros([1])
}
3、定义运算:
定义运算的过程是建立模型的核心过程,直接决定的模型的效果。
-
1、定义正向传播运算:
即定义前向传播的运算,一般问题越复杂,前向神经网络越复杂,后面我会向大家介绍 卷积神经网络、循环神经网络、GooLeNet等 -
2、损失函数:
损失函数就是 输出值 和 真实值 之间的误差,配合反向传播使用,不断迭代中找到最小值,达到模型的最好效果。 -
3、优化函数:
在 正向传播 和 损失函数 的基础上 , 我们使用优化函数对学习参数进行优化,这个过程在反向传播中实现。
反向传播的过程,就是沿着正向传播的过程将误差向反方向传递过去。
之后我们会涉及到:正则化、随机梯度下降等 -
4、初始化变量:
session 创建好后第一件事就是初始化变量!!! -
5、迭代更新参数到最优解
我们一般通过 一次会话 来完成,常常使用with愈发,可以在session结束后自动关闭 -
6、测试模型:
是模型验证节点,一般通过输入模型没有训练过的数据和真实结果,来测试和验证模型的效果。 -
7、使用模型:
和测试模型一样,只是不一定有真实结果进行对比,也代表这神经网络用来解决实际问题。