记录自己的菜。
tensorflow提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量。
因此在传值的时候只需要在命名空间中对响应的name
赋值就好,例如:
input_feed = {model.x.name: x}
上面的用于传值的代码是key-value
的dict()
,其中key
为model
中成员变量x
所对应的name
。
- tf中变量的创建
以下两个定义是等价的
fir:
v = tf.get_variable('v', shape=[1], \ initializer=tf.constant_initializer(1.0))
sec:
v = tf.Variable(tf.constant(1.0, shape=[1], name='v')
二者的最大区别在于:tf.Variable
的变量名是一个可选项,通过name='v'
的形式给出。但是tf.get_variable
必须指定变量名。 - tf命名空间管理
命名空间管理的功能涉及到tf.variable_scope
,tf.name_scope
两个函数,大部分情况下二者是等价的,唯一的区别是在使用tf.get_variable
函数时。
由上面的with tf.variable_scope('foo'): a = tf.get_variable('bar',shape =[1]) print(a.name) # foo/bar:0 with tf.name_scope('aoo'): a=tf.Variable([1]) print(a.name) # aoo/Variable:0 b=tf.get_variable('b',[1]) print(b.name) # b:0
print()
结果可以看出tf.get_variable
创建的变量并不是aoo/b:0
,而是b:0
。这就表示了在tf.name_scope
函数下,tf.get_variable
不受其约束。 - 命名空间的作用
同一个空间下,变量名不能相同。就好像在同一个家庭中,两个家庭成员一般不会取同样的名字,不然在叫人(调用)的时候会产生混淆。因此在同一个在命名空间中创建相同的变量或报错。如:
错误信息:with tf.variable_scope('foo'): v = tf.get_variable('v', \ [1],initializer=tf.constant_initializer(1.0)) with tf.variable_scope('foo'): v1 = tf.get_variable('v',[1])
Variable foo/v already exists, disallowed.Did you mean to set reuse=True in Varscope?
其原因就是在命名空间foo
中创建了相同的变量。如果要在foo
下创建变量v1
,其name='v'
,只需要将reuse
设置为Ture
。
结论:参数with tf.variable_scope('foo', reuse=True): v1 = tf.get_variable('v',[1]) print(v1.name) # foo/v
reuse=False
,tf.variable_scope
创建变量;reuse=True
,tf.variable_scope
获取变量。
Done
网友评论