提示:如果您能安心的读完下文,我相信您会对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总结为以下三种使用的工具
抛出异常(常见)作用域(类似于本文的应用)线程锁(类似于Lock的上锁和解锁)