tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
2018-01-23 16:08
609 查看
scope 命名方法
对于一个复杂的 tensorflow 模型会有很多个变量,
tf.variable_scope() :提供了简单的命名空间技术以避免冲突;
tf.get_variable():从同一个变量范围内获取或者创建;
见名知意,tf.Variable() variable 且以大写字母开头,该函数在于定义一个变量;tf.get_variable():可根据 name 值,返回该变量,如果该 name 不存在的话,则会进行创建;
先说结论:
tf.get_variable() 以及 tf.Variable() 是 TensorFlow 中创建变量的两种主要方式;
如果在 tf.name_scope() 环境下分别使用 tf.get_variable() 和 tf.Variable(),两者的主要区别在于
tf.get_variable() 创建的变量名不受 name_scope 的影响;
tf.get_variable() 创建的变量,name 属性值不可以相同;tf.Variable() 创建变量时,name 属性值允许重复(底层实现时,会自动引入别名机制)
此外 tf.get_variable() 与 tf.Variable() 相比,多了一个 initilizer (初始化子)可选参数;
tf.Variable() 对应地多了一个 initial_value 关键字参数,也即对于 tf.Variable 创建变量的方式,必须显式初始化;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输出为:
2
3
4
一个双层嵌套名称空间:
2
3
4
get_variable() 函数的行为依赖于 reuse 的状态:
case1:reuse 设置为 False,创建并返回新变量:
2
3
case2:reuse 设置为 True,将会按照给定的名字在以存的变量中搜寻:
2
3
4
5
2
3
4
5
6
7
8
9
10
11
12
13
14
对于一个复杂的 tensorflow 模型会有很多个变量,
tf.variable_scope() :提供了简单的命名空间技术以避免冲突;
tf.get_variable():从同一个变量范围内获取或者创建;
见名知意,tf.Variable() variable 且以大写字母开头,该函数在于定义一个变量;tf.get_variable():可根据 name 值,返回该变量,如果该 name 不存在的话,则会进行创建;
1. name_scope()
先说结论:tf.get_variable() 以及 tf.Variable() 是 TensorFlow 中创建变量的两种主要方式;
如果在 tf.name_scope() 环境下分别使用 tf.get_variable() 和 tf.Variable(),两者的主要区别在于
tf.get_variable() 创建的变量名不受 name_scope 的影响;
tf.get_variable() 创建的变量,name 属性值不可以相同;tf.Variable() 创建变量时,name 属性值允许重复(底层实现时,会自动引入别名机制)
此外 tf.get_variable() 与 tf.Variable() 相比,多了一个 initilizer (初始化子)可选参数;
tf.Variable() 对应地多了一个 initial_value 关键字参数,也即对于 tf.Variable 创建变量的方式,必须显式初始化;
import tensorflow as tf with tf.name_scope('a_name_scope'): initilizer = tf.constant_initilizer(value=1) var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32, initilizer=initilizer) # var11 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32, initilizer=initilizer) var2 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32) var21 = tf.Variable(name='var21', initial_value=[2.1], dtype=tf.float32) var22 = tf.Variable(name='var22', initiali_value=[2.2], dtype=tf.float32) with tf.Session() as sess: print(var1.name, sess.run(var1)) # print(var11.name, sess.run(var11)) print(var2.name, sess.run(var2)) print(var21.name, sess.run(var21)) print(var22.name, sess.run(var22))1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输出为:
var1:0 [ 1.] a_name_scope/var2:0 [ 2.] a_name_scope/var2_1:0 [ 2.0999999] a_name_scope/var2_2:0 [ 2.20000005]1
2
3
4
2. variable_scope()
一个双层嵌套名称空间:with tf.variable_scope('foo'): with tf.variable_scope('bar'): v = tf.get_variable('v', [1]) assert v.name == 'foo/bar/v:0'1
2
3
4
3. get_variable()
get_variable() 函数的行为依赖于 reuse 的状态:case1:reuse 设置为 False,创建并返回新变量:
with tf.variable_scope('foo'): v = tf.get_variable('v', [1]) assert v.name == 'foo/v:0'1
2
3
case2:reuse 设置为 True,将会按照给定的名字在以存的变量中搜寻:
with tf.variable_scope('foo'): v = tf.get_variable('v', [1]) with tf.variable_scope('foo', reuse=True): v1 = tf.get_variable('v') assert v1 == v1
2
3
4
5
with tf.variable_scope('a_variable_scope') as scope: initializer = tf.constant_initializer(value=3) var3 = tf.get_variable(name='var3', shape=[1], dtype=tf.float32, initializer=initializer) scope.reuse_variables() # 另一种写法,tf.get_variable_scope().resue_variables() var3_reuse = tf.get_variable(name='var3') var4 = tf.Variable(initial_value=[4.], name='var4', dtype=tf.float32) var4_reuse = tf.Variable(initial_value=[4.], name='var4', dtype=tf.float32) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(var3.name, sess.run(var3)) print(var3_reuse.name, sess.run(var3_reuse))1
2
3
4
5
6
7
8
9
10
11
12
13
14
a_variable_scope/var3:0 [ 3.] a_variable_scope/var3:0 [ 3.] a_variable_scope/var4:0 [ 4.] a_variable_scope/var4_1:0 [ 4.]
相关文章推荐
- TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
- tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
- TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
- 彻底弄懂tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope异同
- tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
- tensorflow学习之路(2-1):tf.variable_scope(), tf.name_scope(), tf.get_variable()的认识
- tensorflow variable_scope,tf.name_scope, tf.variable, tf.get_varible
- tensorflow的共享变量,tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()联系与区别:
- tf.variable_scope()和tf.name_scope(),tf.Variable()和tf.get_variable()
- tensorflow的共享变量,tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()联系与区别
- tf.get_variable tf.variable_scope tf.name_scope
- tensorflow学习之路(2-2):tf.variable_scope(),tf.name_scope(),tf.get_variable()的认识(补充)
- tensorflow的共享变量,tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()联系与区别
- tensorflow之变量作用域与变量共享(name_scope,variable_scope,get_variable,Variable)
- Tensorflow中tf.get_variable和tf.variable_scope的使用
- tensorflow 变量生成 变量管理 tf.Variable & tf.get_variable & tf.variable_scope
- tf.get_variable 和tf.variable_scope
- tf.get_variable 和tf.variable_scope
- tf.get_variable 和tf.variable_scope
- 【tensorflow】scope的使用以及tf.Variable()和tf.get_variable()的区别