Key points:
- 命名空间的实际作用
- 命名空间对变量作用域无影响
- 命名空间多次重复执行时加1操作
- 如何指定变量到相同的命名空间
- namescope 对 get_variable 无影响
1,tf.name_scope()命名空间的实际作用
- 在某个tf.name_scope()指定的区域中定义的所有对象及各种操作,他们的“name”属性上会增加该命名区的区域名,用以区别对象属于哪个区域
- 将不同的对象及操作放在由tf.name_scope()指定的区域中,便于在tensorboard中展示清晰的逻辑关系图,这点在复杂关系图中特别重要。
2,name_scope()只决定“对象”属于哪个范围,并不对“对象”的“作用域”产生任何影响。
在name_scope中定义的对象,从被定义的位置开始,直到后来某个地方对该对象重新定义,中间任何地方都可以使用该对象。本质上name_scope只对对象的name属性进行圈定,并不会对其作用域产生任何影响。比如你在某个城市出生,只能在这里活动,去别的地方就会挂掉,这是不会的!
示例如下:
变量 a 在case1 中定义,但是与case2 输出相同,case3 在不同的with中定义,结果与case1 and 2 相同。 Case4 重新的定义输出,结果与case5 相同。
3. 相同命名空间的多次执行,序号变化
tf.name_scope('cgx_scope')语句重复执行几次,就会生成几个独立的命名空间,尽管表面上看起来都是“cgx_scope”,实际上tensorflow在每一次执行相同语句都会在后面加上“_序数”,加以区别。
见下例:
(1)指定了“cgx_scope”命名区域,并在其中定义变量a;
(2)又指定了相同名称的“cgx_scope”命名区域,并在其中定义变量b;
(3)输出a.name = cgx_scope/my_a:0和b.name = cgx_scope_1/my_b:0,可见b.name已经自动加了“_1”,这是tensorflow的特点,自动检测是否重复,有重复就自动增加数字作为标记。
4. 如何在不同的地方将对象指定到相同的name_scope中?
方法:
with
5. tf.name_scope()对由tf.get_variable()产生的变量没有影响
如下例:
在cgx_scope命名空间下,a是由tf.get_variable()生成的变量,b是由tf.Variable()生成的变量,按规律a.name和b.name的前缀都是cgx_scope,但从输出结果可看出,a.name的前缀没出现,说明a不在该命名空间。后面的tensorboard图也说明了这点。出现这种情况是由tf.get_variable()的特性决定的。
参考:
https://www.jianshu.com/p/635d95b34e14