图与会话
图
tf.Graph
TensorFlow计算,表示为数据流图。一个图包含一组表示 tf.Operation计算单位的对象和tf.Tensor表示操作之间流动的数据单元的对象。默认Graph值始终注册,并可通过调用访问 tf.get_default_graph。
a = tf.constant(1.0)
assert c.graph is tf.get_default_graph()
我们可以发现这两个图是一样的。那么如何创建一个图呢,通过tf.Graph()
g1= tf.Graph()
g2= tf.Graph()
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(g1,g2,tf.get_default_graph())
图的其它属性和方法
作为一个图的类,自然会有一些图的属性和方法。
as_default()
返回一个上下文管理器,使其成为Graph默认图形。
如果要在同一过程中创建多个图形,则应使用此方法。为了方便起见,提供了一个全局默认图形,如果不明确地创建一个新的图形,所有操作都将添加到此图形中。使用该with关键字的方法来指定在块的范围内创建的操作应添加到此图形中。
g = tf.Graph()
with g.as_default():
a = tf.constant(1.0)
assert c.graph is g
会话
tf.Session
运行TensorFlow操作图的类,一个包含ops执行和tensor被评估
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
sess = tf.Session()
print(sess.run(c))
在开启会话的时候指定图
with tf.Session(graph=g) as sess:
资源释放
会话可能拥有很多资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase。在不再需要这些资源时,重要的是释放这些资源。要做到这一点,既可以调用tf.Session.close会话中的方法,也可以使用会话作为上下文管理器。以下两个例子是等效的:
# 使用close手动关闭
sess = tf.Session()
sess.run(...)
sess.close()
# 使用上下文管理器
with tf.Session() as sess:
sess.run(...)
run方法介绍
run(fetches, feed_dict=None, options=None, run_metadata=None)
运行ops和计算tensor
- fetches 可以是单个图形元素,或任意嵌套列表,元组,namedtuple,dict或OrderedDict
- feed_dict 允许调用者覆盖图中指定张量的值
如果a,b是其它的类型,比如tensor,同样可以覆盖原先的值
a = tf.placeholder(tf.float32, shape=[])
b = tf.placeholder(tf.float32, shape=[])
c = tf.constant([1,2,3])
with tf.Session() as sess:
a,b,c = sess.run([a,b,c],feed_dict={a: 1, b: 2,c:[4,5,6]})
print(a,b,c)
错误
- RuntimeError:如果它Session处于无效状态(例如已关闭)。
- TypeError:如果fetches或feed_dict键是不合适的类型。
- ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在。
其它属性和方法
graph
返回本次会话中的图
as_default()
返回使此对象成为默认会话的上下文管理器。
获取当前的默认会话,请使用 tf.get_default_session
c = tf.constant(..)
sess = tf.Session()
with sess.as_default():
assert tf.get_default_session() is sess
print(c.eval())
注意: 使用这个上下文管理器并不会在退出的时候关闭会话,还需要手动的去关闭
c = tf.constant(...)
sess = tf.Session()
with sess.as_default():
print(c.eval())
# ...
with sess.as_default():
print(c.eval())
sess.close()