-
variable的过程说明:[1]
- variable是特殊的tensor,可以用
sess.run(var)
和var.eval()
获取变量的值 -
variable(value)
其实是对变量进行定义,tf.global_variable_initializer()
和saver.restore(sess,'model/model.ckpt')
是对变量进行初始化,
还可以使用tf.assign(var,value)
进行初始化 - 变量的值其实是保存在sess代码块中,离开代码块,变量的值就会消失.**
- variable是特殊的tensor,可以用
-
varibale的trainable参数说明:[2]
- trainable参数主要是用来说明变量能够被优化器以梯度下降的形式进行更新
- trainable参数一旦指定就不能被修改,该变量会被添加到
trainable_variables
集合中 - 定义优化器minimize张量的时候,会读取
trainable_variables
,之后,不管trainable_variables
中的变量怎么变化,都不影响优化器优化。
-
tf中的集合说明:[3]
- 常用的:global_variables() ; trainable_variables() ; moving_average_variables() ;
- 另外还能够使用
get_collection(集合名)
结合add_to_collections(var_name,var)
自己创建集合,并且从集合中取得变量。
-
创建变量和取得变量:[4]
- 优点:不用在定义方法的时候,传递变量,直接从当前环境中取得即可
注意点:
-
tf.get_variable( name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=None, collections=None, caching_device=None, partitioner=None, validate_shape=True, use_resource=None, custom_getter=None, constraint=None, synchronization=<VariableSynchronization.AUTO: 0>, aggregation=<VariableAggregation.NONE: 0>, )
主要的是name,shape,dtype,initializer,trainable参数。
基本使用和tf.Variable()
相似
name
:用于指定变量名,必填
shape
L用于指定变量形状,必填
dtype
:用于指定变量数据类型,必填
initializer
:用于初始化变量,选填,如果不填则默认产生服从均匀分布的变量
一共有7种initialzer:
image.png
-
创建变量:
下面3种情况: 在tf.variable_scope()
代码块外 ;tf.variable_scope(reuse=None\False)
时 ;tf.variable_scope(不指定reuse)
时 , 指的都是创建变量
如果图中已经有这个同名变量,则会报错。 -
获取变量
下面这种情况:tf.variable_scope(reuse = True)
代码块内的get_variable()
方法会获取变量,如果不存在该变量,则会报错 -
变量环境嵌套
有两种情况:
- 内部不声明时,会继承外部环境reuse
with tf.variable_scope('a',reuse=True): with tf.variable_scope('b'): #此处的reuse为True,获取变量 #此处,b代码块外,reuse为True,获取变量
- 内部变量环境比外部变量环境优先级高
with tf.variable_scope('a'): with tf.variable_scope('b',reuse=True): #此处的reuse为True,获取变量 #此处,b代码块外,reuse为false,创建变量
-
变量环境也是命名空间
创建变量时,有自己的名字,
特点:如tf.Variable('a')
->name : a:0(其中a表示op名,当有重复命名'a'时,会在后面加数字成为'a_1','a_2'等 ; 其中:0表示op操作产生几个结果,一般都是由一个返回值,所以一般为0,有些情况下如tf.top_k()
会有多个返回值,则分别为 :0 , :1)命名空间的名字会拼接在变量名前面,中间用 ‘\’ 分割。
-
可以在别的命名空间中,通过op名字获取变量,(获取到的变量就是之前创建的变量,使用 is 判断返回True) ,这个特点形成了
get_variable
的优点。
- 优点:不用在定义方法的时候,传递变量,直接从当前环境中取得即可
-
模型持久化:[5]
-
主要通过
tf.train.Saver()
创建saver, 用来保存变量,
使用saver.save(sess,'model/model.ckpt')
来保存变量
虽然指定了一个文件model.ckpt,但实际会保存三个文件
model.ckpt : 用来保存模型中的变量值
model.ckpt.meta : 用来保存模型的结构
checkpoint :用来保存一个目录下所有模型文件列表 -
定义好节点运算,将保存的模型加载到节点中
saver.restore(sess,'model/model.ckpt')
-
也可以不用重复定义节点,将模型中的节点加载到图中
saver = tf.train.import_meta_graph('model/model.ckpt.meta') with tf.Session() as sess: saver.restore(sess,'model/model.ckpt')
-
模型情况下,saver的保存和加载是用来描述整张图中的节点,
保存:则可以将所有的节点保存到模型中
加载时:如果重新定义的图中的节点数少于保存模型中的节点数,程序正常,会对定义的节点填充
如果重新定义的图中的某个节点名不存在与保存的模型的节点列表中,则会报错,即不允许有一个节点名字错误 -
选择性加载:
当想在之前模型的基础上加载变量,则可以选择性的加载变量;或者保存的时候,也可以选择性的保存某些变量
保存:saver = tf.train.Saver([变量对象])
可以选择某些变量进行保存
加载:saver = tf.train.Saver([变量对象])
可以选择保存模型中的某些变量加载到定义的图中的变量中
可能碰到,新定义的图中的变量其实是保存模型中的变量,但是名字发生了改变,则可以使用saver = tf.train.Saver({‘该变量在保存模型中的名称’:图中的变量})
对该变量进行加载
没有加载的变量,需要使用sess.run(tf.global_variables_initializer())
进行初始化, -
其实对于变量的初始化就是对变量进行赋值。
-
保存和加载滑动平均中的影子变量:
保存:由于影子变量也在全局变量中,直接使用saver.save()
即可实现保存
加载:由于将影子变量加载到原变量中,需要重命名,因为影子变量的名称是 变量名\expotionalmovingaverage ,所以可以使用字典的形式对影子变量进行加载
另外,tf.train.exponentialmovingaverage
提供了便捷生成影子变量名的方法,
``` ema = tf.train.exponentialmovingaverage(0.9) ema.variables_to_restore() #该方法可以生成类似 {'变量名\expotionalmovingaverage' : var} 的字典 ``` 所以将该返回值添加到tf.train.Saver(0)中,就可以将影子变量加载到原变量中。
-
网友评论