一、不同的graph 中变量名重复,覆盖。
理解每个graph 中的变量都是全局变量,而不是局部变量。这样最终的结果是只有一个 a ,那么gh1 中没有变量a(name='dd'),所以当试图输出gh1 中的a的时候会有这种错误。(如何理解这里的覆盖,我还没有想好怎么描述)
#代码手写,并没有运行,仅是展示
#错误代码
gh1 = tf.Graph()
with gh1.as_default():
a = tf.Variable(10, tf.float32, name='dd')
gh2 = tf.Graph()
with gh2.as_default():
a = tf.Variable(11, tf.float32, name='dd')
with tf.Session(graph=gh1) as sess1:
sess1.run(tf.global_variables_initializer())
print(sess1.run(a))
with tf.Session(graph=gh2) as sess2:
sess2.run(tf.global_variables_initializer())
print(sess2.run(a))
#正确代码
gh1 = tf.Graph()
with gh1.as_default():
a = tf.Variable(10, tf.float32, name='dd')
gh2 = tf.Graph()
with gh2.as_default():
b = tf.Variable(11, tf.float32, name='dd')
with tf.Session(graph=gh1) as sess1:
sess1.run(tf.global_variables_initializer())
print(sess1.run(a))
with tf.Session(graph=gh2) as sess2:
sess2.run(tf.global_variables_initializer())
print(sess2.run(b))
二、 graph 中的变量初始化错误
#代码手写,并没有运行,仅是展示
#错误代码
aa = tf.Variable(10, tf.float32, name='dd')
gh1 = tf.Graph()
with gh1.as_default():
a = tf.Variable(10, tf.float32, name='dd')
tf.Session(graph=gh1) as sess1:
sess1.run(tf.global_variables_initializer())
print(sess1.run(a))
#这种情况下不能正确输出,主要是因为sess1.run(tf.global_variables_initializer()) 初始化位置错误
2.1 首先理解默认graph,在tensorflow 中有一个默认的,一开始就创建好的graph。 大部分情况下都是这个对这个graph进行操作。如果想要创建新graph ,并添加元素。应该是:
gh = tf.Graph()
with gh.as_default():
a = tf.Variable(10,tf.float32, name='dd')
aa =tf.Variable(10,tf.float32, name='dd')
在with中新建的各种量会添加到gh图中。一旦推出 with ,就又会回到 default_graph 中去,例如 aa 就是添加到默认 graph 中。
2.2 在进行sess1.run(tf.global_variables_initializer())的时候
是将默认的 graph 中的变量加载到Session中。而不是将Session(graph=gh1)中 gh1中的变量加载到 Session 中。通过以下方法验证:
#代码手写,并没有运行,仅是展示
#正确代码
aa = tf.Variable(10, tf.float32, name='dd')
gh1 = tf.Graph()
with gh1.as_default():
a = tf.Variable(10, tf.float32, name='dd')
tf.Session(graph=tf.get_default_graph) as sess1:
sess1.run(tf.global_variables_initializer())
print(sess1.run(aa))
2.3 两种方式解决
(1)使用with tf.Session(graph=gh1) as sess ; 在其内部执行变量初始化
(2)单独使用with gh1.as_default() ; 将变量初始化操作置于此图的作用区域(有点别扭)。
注:这两种方法是在你一定要将“变量初始化”操作放在后面写解决方案
#代码手写,并没有运行,仅是展示
#方案1
#正确代码
aa = tf.Variable(10, tf.float32, name='dd')
gh1 = tf.Graph()
with gh1.as_default():
a = tf.Variable(10, tf.float32, name='dd')
with tf.Session(graph=gh1) as sess1:
sess1.run(tf.global_variables_initializer())
print(sess1.run(a))
#方案1
#正确代码
aa = tf.Variable(10, tf.float32, name='dd')
gh1 = tf.Graph()
with gh1.as_default():
a = tf.Variable(10, tf.float32, name='dd')
sess1 = tf.Session(graph=gh1)
with gh1.as_default():
sess1.run(tf.global_variables_initializer())
print(sess1.run(a))
sess1.close()
注:以上所有的结论来自一步步的实验,加上自己的猜测,并非来自官方手册。希望批评指正。
因分享而快乐