Tensorflow入门
计算模型–计算图
-
概念
Tensor 表明了数据结构,flow体现了它的计算模型,直观地表达了张量之间通过计算相互转换的过程。
每个计算都是计算图上的一个节点,节点之间的边描述了计算之间的依赖关系。
数据模型–张量
-
结构
一个张量中主要保存了三个属性:名字、维度和类型。
- 名字:张量唯一的标识符,同时给出了这个张量是如何计算出来的。“node:src_output”,node为节点名称, src_output表示来自节点的第几个输出。
- 维度:描述张量的维度信息。
- 类型
-
. 使用
- 对中间结果的引用
- 用来获得计算结果。张量本省不存储具体的数字,通过session后可以得到具体的数字。
运行模型–会话
-
会话拥有管理程序运行是的所有资源。
-
会话的两种模式:
明确调用会话生成函数和关闭会话函数
# 创建会话 sess = tf.Session() # 使用会话得到运算的结果 sess.run(...) # 关闭会话 sess.close()
通过
python
上下文管理器使用会话# 创建会话 with tf.Session() as sess: sess.run(...) .... # 不需要调用close关闭会话,上下文退出时会话自动关闭和资源自动释放
-
会话指定后,可以通过
tf.Tensor.eval
来计算张量的取值。 -
交互式环境下,使用
tf.Interactivesession
自动将生成的会话注册为默认会话,获取张量比较方便,省去将产生的会话注册为默认会话的过程。 -
通过
ConfigProto Protocol Buffer
配置需要生成的会话
config = tf.ConfigProto(allow_soft_placement=True, # 增强程序的可移植性
# 日志中记录每个节点被安排在那个设备上方便调试
log_device_placement=True)
sessl = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)
Tensorflow 变量
-
变量与张量之间的关系
变量的声明函数
tf.Variable
是一个运算,这个运算的输出结果就是一个张量,所以变量只是一种特殊的张量。 -
tf.Variable
tf.global_varibales()
拿到当前计算图中所有的变量通过
trainable
区分需要优化的参数和其他参数。 -
变量在构建后,类型不能再改变
变量管理
-
tf.Variable
和tf.get_variable
的区别-
tf.get_variable
用于创建变量时,它和tf.Variable
的功能基本等价。 -
tf.Variable
和tf.get_variable
最大的区别在于指定变量名称的参数。对于
tf.Variable
,变量名称是一个可选参数,通过name="v"
的形式给出对于
tf.get_variable
,变量名称是一个必填的参数,函数会根据这个名字去创建或者获取变量。
-
-
tf.get_variable
的使用-
当
tf.variable_scope
函数使用参数reuse=True
生成上下文管理器时,这个上下文管理器内所
有的tf.get_variable
函数会直接获取己经创建的变量。如果变量不存在,tf.get_variable
函数将报错;相反,如果tf.variable_scope
函数使用参数reuse=None
或者reuse=False
创建上下文管理器,tf.get_variable
操作将创建新的变量。如果同名的变量已经存在,则 函数报错。 -
tf.variable_scopt
可以嵌套-
通过
tf.get_variable_scope
获取当前上下文管理器的reuse
值。with tf.variable_scope ("root"): print(tf.get_variable_scope().reuse) # 输出为False with tf.variable_scope("foo", reuse=True): print(tf.get_variable_scope().reuse) # 输出为True with tf.variable scope("bar"): # 不指定reuse, print(tf.get_variable_scope().reuse)# 输出为True,当前值会与外 # 面一层保持一致 print(tf.get_variable_scope().reuse) # reuse回到值为False
-
在命名空间内创建的变量名称会带上这个命名空间名作为前缀。
with tf.variable_scope("foo"): v2 = tf.get_variable("v", [1]) print(v2.name) # 输出foo/v:0 with tf.variable_scope("foo"): with tf.variable_scope("bar"): v3 = tf.get_variable("v", [1]) print v3.name # 输出foo/bar/v:0
-
-
模型持久化
-
保存和还原网络模型
- Tensorflow提供了tf.train.Saver类。
import tensorflow as tf vl = tf.Variable(tf.constant(l.0 , shape=[l]), name="vl") v2 = tf.Variable(tf.constant(2.0 , shape=[l]), name="v2") result = vl + v2 init_op= tf.global_variables_initializer() # 声明 tf.train.Saver 类用于保存模型。 saver = tf.train.Saver() with tf.Session() as sess : sess.run(init_op) # 将模型保存到/path/to/model/model.ckpt 文件。 saver.save(sess,"/path/to/model/model.ckpt")
-
路径下会生成4个文件(0.11版本以后)参考stackoverflow回答
.cpkt.meta:保存了计算图的结构。
.cpkt.data:保存每个训练变量的取值。
.cpkt.index:
checkpoint:保存了一个目录下所有的模型文件列表。