**
Session(会话)
**
在tensorflow中数据流图中的Op在得到执行之前,必须先创建Session对象,
Session对象负责着图中所以Op的执行.
Session 对象创建时有三个可选参数:
1.target,在不是分布式中使用Session对象时,该参数默认为空
2.graph,指定了Session对象中加载的Graph对象,如果不指定的话默认加载当前默认的数据流图,但是如果有多个图,就需要传入加载的图对象
3.config,Session对象的一些配置信息,CPU/GPU使用上的一些限制,或者一些优化设置
import tensorflow as tf
# 在默认数据流图中创建Op,tensor
# tf.add()是一个Operation简称Op,a是一个tensor
a = tf.add(1, 2)
b = tf.add(a, 3)
# 创建一个Session对象,没有指定graph参数默认加载,默认数据流图
sess = tf.Session()
sess = tf.Session(graph=tf.get_default_graph)
# 以上两种方式是等价的,都是加载默认数据流图
Session对象的run()方法
run()计算张量对象的输出,
sess.run(a) # 输出3
sess.run(b) # 输出6
run()方法接受一个参数和三个可选参数:
1.fecthes,接受数据流图中的(所有的Op和tensor),也就是希望执行的对象,tensor对象一般会返回数或数组,Op没有返回值None.
# 在sess.run(b)中,fecthes的参数是tensor:b,(对应的Op是tf.add()),
# sess会找到与b有数据依赖的节点,然后顺序执行
sess.run(b)
#fecthes也会接受Op,比如变量的初始化:
init = tf.global_variables_initializer()
sess.run(init)
# 返回值为None
2.feed_dict参数,用于覆盖数据流图中的tensor对象,接受的参数类型为Python的字典对象
字典的'键'为被覆盖的tensor对象的句柄,'值'可以是各种数据类型,但是必须和被覆盖tensor
的类型相同或者能够转换为相同类型
import tensorflow as tf
a = tf.add(1, 2)
b = tf.add(a, 10)
sess = tf.Session()
sess.run(b)
13
# 定义一个字典,覆盖tensor a
replace_dict = {a : 20}
sess.run(b, feed_dict=replace_dict)
30
关于回话对象使用结束后需要关闭调用close方法,释放资源sess.close()
# 将Session对象作为上下文管理器来使用,离开作用域,Session对象会自动关闭
with tf.Session() as sess:
#.......Op,tensor
-----------------------------------
# 也可以像图对象一样被隐式使用
sess = tf.Session()
with sess.as_default():
a.eval() # 类似与run(a)
# 但是必须手动关闭
sess.close()
tensorflow中的占位节点
占位节点是用来接收输入值的,它们的作用和tensor对象类似,在创建时不用指定具体的数值,它们的作用是为将要用到的tensor对象预留位置,相当于输入节点
import tensorflow as tf
import numpy as np
# 创建一个占位节点tf.placeholder()
# 第一参数是dtype是必须指定的,
# 第二个参数shape,默认为None,接收任意形状的tensor,长度为2的一阶张量
# 第三个参数name,用来标识这个Op
a = tf.placeholder(tf.int32, shape=[3], name='input')
b = tf.reduce_sum(a, name='sum')
# 在Session对象的run()方法中,通过字典给占位节点传递值
# 在计算b时,在run()方法中,只用给b有依赖的占位节点,覆盖数值
# 没有依赖的节点不需要包含在feed_dict中
sess = tf.Session()
sess.run(b, feed_dict={a: np.array([1, 2, 3], dtype=np.int32)})
6