tf.get_default_graph()和as_default()小总结:
tf.get_default_graph() tensorflow中可以通过这个API获取当前代码中的默认会话对象
as_default()这个操作,就是将with语句块中的默认图修改为当前构建的tf.Graph()这个对象;也就是:as_default的操作是将新建的图在当前这个with语句块的范围内设置为默认图
参考别人的博客内容:
tf.Graph()和as_default()
- tf.Graph()表示实例化一个用于tensorflow计算和表示用的数据流图,不负责运行计算。在代码中添加的操作和数据都是画在纸上的画,而图就是呈现这些画的纸。我们可以利用很多线程生成很多张图,但是默认图就只有一张。
- tf中可以定义多个计算图,不同计算图上的张量和运算是相互独立的,不会共享。计算图可以用来隔离张量和计算,同时提供了管理张量和计算的机制。
- 使用g = tf.Graph()函数创建新的计算图
- 在with g.as_default():语句下定义属于计算图g的张量和操作
- 在with tf.Session()中通过参数graph=xxx指定当前会话所运行的计算图
- 如果没有显示指定张量和操作所属的计算图,则这些张量和操作属于默认计算图
- 一个图可以在多个sess中运行,一个ses也能运行多个图。建议:如果有多个图和多个会话,最好是将一个一个的会话写到对应的图里面。
import tensorflow as tf
tf.Session()
with tf.Graph().as_default():
# tf.Graph()没有__enter__和__exit__内置方法。所以调用as_default();as_default()的返回值是使此图成为一个默认的图的上下文管理器
a = tf.constant(1.0)
b = tf.constant(2.0)
# 构建Session会话的时候,如果没有给定graph的,使用的是默认的graph
with tf.Session() as sess:
print(sess.run(a))
print(sess.run(b))
'''
a = tf.constant([1.0, 2.0])
b = tf.constant([2.0, 3.0])
result = a + b
# 定义两个计算图
g1 = tf.Graph()
g2 = tf.Graph()
# 在g1中定义张量和操作
with g1.as_default(): # as_default()的返回值是使此图成为一个默认的图的上下文管理器
a = tf.constant([1.0, 1.0])
b = tf.constant([1.0, 1.0])
result1 = a + b
# 在g2中定义张量和操作
with g2.as_default():
a = tf.constant([2.0, 2.0])
b = tf.constant([2.0, 2.0])
result2 = a + b
with tf.Session() as sess:
out = sess.run(result)
print(out)
'''
关于Graph的更深理解
import tensorflow as tf
print("外部代码中的默认图:{}".format(tf.get_default_graph()))
# 创建一个新的图对象
new_graph = tf.Graph()
print("新创建的新图:{}".format(new_graph))
# with tf.Graph():
# # 这段代码报错
# print("第一个With语句块中的默认图:{}".format(tf.get_default_graph()))
with new_graph.as_default():
# as_default的操作是将新建的图在当前这个with语句块的范围内设置为默认图
print("第二个With语句块中的默认图:{}".format(tf.get_default_graph()))
with tf.Session() as sess:
print("Session中的默认图:{}".format(tf.get_default_graph()))
print("外部代码中的默认图:{}".format(tf.get_default_graph()))
'''
代码执行结果如下:
外部代码中的默认图:<tensorflow.python.framework.ops.Graph object at 0x00000036C816E508>
新创建的新图:<tensorflow.python.framework.ops.Graph object at 0x00000036C8C6B148>
第二个With语句块中的默认图:<tensorflow.python.framework.ops.Graph object at 0x00000036C8C6B148>
Session中的默认图:<tensorflow.python.framework.ops.Graph object at 0x00000036C816E508>
外部代码中的默认图:<tensorflow.python.framework.ops.Graph object at 0x00000036C816E508>
'''