TensorFlow with方法和tf.variable_scope联合使用的原理

提示:如果您能安心的读完下文,我相信您会对with用法又会有一个新的认识


实例代码

with tf.variable_scope(get_name("abc")) as scope1:
	v2 = tf.get_variable('v2', shape=[4,9],initializer=tf.constant_initializer())
	with tf.variable_scope(get_name("efg")) as scope2:
	v3 = tf.get_variable('v3', shape=[4,9],initializer=tf.constant_initializer())

对于上述代码仅仅是一个演示(想要运行是不可能的)

在这里,我仅仅想说明的是关于with 和 tf.variable_scope联合时 取出变量名字是如何定义的。


对于变量名v2的提取:其名称应该为:abc/v2
对于变量名v3的提取:其名称应该为:abc/efg/v3


得到的这个结果的原因是什么呢?

其实,和with方法是有关系的

with方法,在我们看来仅仅是用于抛出异常的,但是它的这种操作也相当于进展出栈的过程

比如,我们定义了一个Session会话,变量在调用的过程就是一个进栈出栈的过程

当在调用变量v2的时候,我们首先会进入with的__enter__方法,这也就是进栈的过程

此时也就相当于是scope1进入栈中

当执行完变量名的定义后

我们会进入with的__exit__的方法,这也就是弹栈的过程

这样获取的变量名称就是:abc/v2

对于变量v3,同样的道理

scope1进栈,随后scope2进栈,当获取变量后,再执行弹栈操作,最终获取到了变量的名称为:abc/efg/v3


依据目前的学习,我将with总结为以下三种使用的工具

  1. 抛出异常(常见)
  2. 作用域(类似于本文的应用)
  3. 线程锁(类似于Lock的上锁和解锁)

你可能感兴趣的:(深度学习)