1. VariableScope and NameScope
1.1 variable scope
tf.variable_scope()是用来实现变量共享 : 可以作用于var和op.
e.g.
with tf.variable_scope("v_scope_1"):
v1 = tf.get_variable("variable1", [6], initializer=tf.constant_initializer(1.0))
v2 = tf.get_variable("variable2", [6], initializer=tf.constant_initializer(2.0))
print v1.name
print v2.name
v_scope_1/variable1:0
v_scope_1/variable2:0
接口详细分析
tf.variable_scope()
__init__(
name_or_scope,
default_name=None,
values=None,
initializer=None,
regularizer=None,
caching_device=None,
partitioner=None,
custom_getter=None,
reuse=None,
dtype=None,
use_resource=None,
constraint=None,
auxiliary_name_scope=True
)
name_or_scope:
可以是name也可以是已经创建的scope,用法如下:
initializer:
在scope中使用本参数初始化var
with tf.variable_scope("v_scope_1", initializer=tf.constant_initializer(6.)):
v1 = tf.get_variable("variable1", [6])
v1=[6. 6. 6. 6. 6. 6.]
reuse:
在var创建后,share这个var
def foo():
with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
v = tf.get_variable("v", [1])
return v
v1 = foo() # Creates v.
v2 = foo() # Gets the same, existing v.
assert v1 == v2
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
with tf.variable_scope("foo", reuse=True):
v1 = tf.get_variable("v", [1])
assert v1 == v
with tf.variable_scope("foo") as scope:
v = tf.get_variable("v", [1])
scope.reuse_variables()
v1 = tf.get_variable("v", [1])
assert v1 == v
auxiliary_name_scope
暂时未知
1.2 name scope
tf.name_scope()是op的名称空间 : 可以作用与op.
2. Save and Restore
2.1 简单的model save 和 restore
model save
with tf.variable_scope("v_scope_1", initializer=tf.constant_initializer(6.)):
v1 = tf.get_variable("variable1", [1])
with tf.name_scope("v_assign_op_1"):
v1 = tf.assign(v1, [8.0])
saver = tf.train.Saver()
with tf.Session() as sess:
vars_init_op = tf.global_variables_initializer()
sess.run(vars_init_op)
r1 = sess.run(v1)
print r1
model restore : v1在上面的代码中初始化为6.,后被assign置为8.并存在model中,然后在下面的代码中读取
with tf.variable_scope("v_scope_1", initializer=tf.constant_initializer(6.)):
v1 = tf.get_variable("variable1", [1])
#with tf.name_scope("v_assign_op_1"):
# v1 = tf.assign(v1, [8.0])
saver = tf.train.Saver()
with tf.Session() as sess:
#vars_init_op = tf.global_variables_initializer()
#sess.run(vars_init_op)
saver.restore(sess, "./model.ckpt")
r1 = sess.run(v1)
print r1
2.2 在save和restore时改名,部分restore
挑选var保存 : 只保存var_list中的变量
var_list = []
with tf.variable_scope("v_scope_1", initializer=tf.constant_initializer(6.)):
v1 = tf.get_variable("variable1", [1])
v2 = tf.get_variable("variable2", [1])
var_list.append(v1)
with tf.name_scope("v_assign_op_1"):
v1 = tf.assign(v1, [8.0])
v2 = tf.assign(v2, [8.0])
saver = tf.train.Saver(var_list)
with tf.Session() as sess:
vars_init_op = tf.global_variables_initializer()
sess.run(vars_init_op)
r1, r2 = sess.run([v1, v2])
print r1, r2
saver.save(sess, "./model.ckpt")
[8.] [8.]
挑选var读取 : 注意读取时name和scope都要对应上
var_list = []
with tf.variable_scope("v_scope_1", initializer=tf.constant_initializer(6.)):
v1 = tf.get_variable("variable1", [1])
v2 = tf.get_variable("variable2", [1])
var_list.append(v1)
# with tf.name_scope("v_assign_op_1"):
# v1 = tf.assign(v1, [8.0])
# v2 = tf.assign(v2, [8.0])
saver = tf.train.Saver(var_list)
with tf.Session() as sess:
vars_init_op = tf.global_variables_initializer()
sess.run(vars_init_op)
saver.restore(sess, "./model.ckpt")
r1, r2 = sess.run([v1, v2])
print r1, r2
[8.] [6.]
通过dict保存、读取