引言:html
按照个人理解,graph至关于一块空白的面包板(电路板,能够在上面插电路元件设计电路,供电调试),上面搭建了许多子模块,自顶向下构成一整个功能电路,整个模块有输入输出端口,里面的子模块或者部分子模块node
构成的模块也有输入和输出端口。搭建好的这个电路板就是 'graph',而测试(执行)相应模块都须要开一个session,上面有不少模块能够调试,也就是说一个graph能够开多个session来执行各自模块的输入输出过程。借网上dao来的图做个说明:服务器
接下来看一小段代码:session
参考连接:https://blog.csdn.net/vinceee__/article/details/88075451 https://blog.csdn.net/vinceee__/article/details/88075451函数
注:如下伪代码仅帮助理解学习
1 val = tf.variable(initilizer, ...) #变量定义 2 const_1 = tf.constant() #常量定义 3 data =3 #定义 4 op = tf.assign(val, const_1) #定义赋值操做 5 c = tf.placeholder(dtype= ,shape = []) #placeholder占位符定义 6 #使用以前定义的变量, 须要定义一个初始化操做init, sess开始后执行变量初始化 7 init = tf.global_varibales_initializer()#全局变量初始化操做 8 with tf.session() as sess: 9 sess.run(init) #执行初始化操做 10 sess.run(op) #执行操做: 将常量const_1赋值给变量val 11 print(sess.run(val)) 12 print(sess.run(c, feed_dict = {c:data})#将data值传递到c这个占位符,执行打印 c
以上代码没有新建graph,默认使用的是TensorFlow的全局的defaultgraph.若是须要使用本身定义的graph,则使用with tf.graph().as_default()来取代默认的全局计算图 测试
1、GRAPHfetch
一、有关graphui
计算图graph 由许多个node 组成,node又由name(名称),op(操做),input(输入),attrs(属性:dtype,shape, size, value... ...构成),对于tf.constant()函数只会产生一个node,可是对于tf.varibale(initialize, name),其中生成一个initializer初始化器,一共会产生三个node:lua
1)variable:变量维护(不存放实际的值)
2) Varibale/assign: 变量分配
3) variable/read: 变量读取使用
使用变量时须要进行变量初始化:生成初始化器对象,再在sess中执行init.
二、graph的使用
1) Tf.get_default_graph(): 得到当前默认graph
2) With Tf.Graph().as_default(): tf.graph()建立一个新的graph,并经过as_default()设置为上下文中的默认图(局部的),即with下面全部的定义都是在这个新建的 (局部的)graph中。
With以外另外的graph做为默认,get_default_graph能够得到当前的图。
3) tensorflow 有一个默认的全局graph, 不用定义可直接使用,若须要另外的graph则须要新建(tf.graph()在当前使用with范围内设置为default)
2、Session
一、有关session
tf.session 是用来运行TensorFlow操做的类,一个session对象封装了操做执行对象的环境,在这个环境下才能够对tensor对象进行计算,tensor对象不可直接进行计算操做,同时也会负责分配计算资源和变量存放:
1)步骤: build a graph #构建一个计算图(里面有操做、tensor对象)
launch the graph in a session #基于以上建立的graph建立一个session
evaluate the tensor #执行计算
2) session: 包括一些资源,例如variables, queues, readers 当咱们再也不须要这些资源时候,咱们须要释放这些资源,释放资源能够经过执行sess.close(),或者将session做为上下文管理器使用:
with tf.session() as sess:
.... ....
sess.run()
执行到with范围之外,session资源释放
3) configProto protocol buffer 公开session的各类配置选项。
ConfigProto详解:
tf.configProto函数用在建立session的时候对session进行参数配置。
3.1)Tf.ConfigProto(log_device_placement=True)
log_device_placement=True,能够获取到operations 和tensor 被指派到哪一个设备(几号CPU/GPU)上运行,会在终端打印出各项操做在哪一个设备上面运行。
3.2) Tf.ConfigProto(allow_soft_placement=True)
在tf中,经过“with tf.device('cpu:0'):”来手动设置操做运行的设备。若是手动设置的设备不存在或者不可用,就会致使程序等待或者异常,为了防止这种状况,allow_soft_placement=True,能够容许tf自动选择一个存在并可用的设备
来运行操做。
3.3) 限制GPU的资源使用:
为了加快运行效率,tf在初始化时候会尝试分配全部可用GPU显存资源给本身,若是在多人使用的服务器上工做会致使别人没法正常使用GPU。
tf提供了两种控制GPU资源使用的方法:
3.3.1) 设置动态申请显存,须要多少就申请多少
sess_config = tf.configProto(log_device_placement=False, allow_soft_placement = True) sess_config.gpu_options.allow_growth = True session = tf.session(config = sess_config)
3.3.2) 限制GPU的使用率,以下两种方法:
sess_config = tf.configProto(log_device_placement= Fa;se ,allow_soft_placementt= True) sess_config.gpu_options.per_process_gpu_memory_fraction = 0.4#占用40%显存 session = tf.session(config = sess_config) gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction= 0.4) sess_config = tf.configProto(gpu_options = gpu_options)
3.3.3) 设置使用哪块GPU:
os.environ['CUDA_VISIBLE_DEVICES']= '0'
os.environ['CUDA_VISIBLE_DEVICES']='0,1'
使用上下文管理器,手动指定session在哪块gpu上执行
with tf.device('/gpu:0'):
... ... ... ...
with tf.session(config = tf.configProto(log_device_placement=True)) as sess:
print sess.run()
参考网址: https://blog.csdn.net/dcrmg/article/details/79091941
https://www.cnblogs.com/ywheunji/p/11390219.html
4) tf.session.run():
Tf.Session.run( fetches, feed_dict=None):
Fetches: 是个list,里面包括了咱们想要输出的一个或者多个graph元素,tensor/ sparse tensor、operation等,见以上文献例子。
Feed_dict: 是个dict,里面包括须要输入的参数名称和实际参数传入的key_value 对。
这个method运行一步TensorFlow计算,经过运行须要的graph 片断来执行每一个操做和计算fetches里的每一个Tensor,用feed_dict里面的值替换相应的输入值
5) tf.session() as sess: 和 tf.session().as_default() as sess:
g = tf.graph() #新建graph session = tf.session(graph = g) #将新建的graph加载到session with g.as_default() #必须为当前指定default graph(由于可能有多个graph存在)
5.1) with session.as_default() as sess:
g_model = tf.Graph() g_session = tf.Session(graph = g_model) with g_model.as_default() as g: with g_session.as_default() as sess: c = tf.constant(1) print(sess.run(c)) print(tf.get_default_session()) print(tf.get_default_graph()) print(tf.get_default_graph()) print(sess.run(c)) sess.close() print(sess.run(c))
print results:
with以外 sess.close 以前 sess.run(c): 1 也就是说sess没有自动关闭; 手动sess.close以后,sess.run(c)就error了,而get_default_session只能在with内有效,with外是None.
5.2) tf.session() as sess:
with g_Model.as_default() as g: with g_session as sess: c=tf.constant(1) print(sess.run(c)) print(tf.get_default_session()) print(tf.get_default_graph()) print(tf.get_default_graph()) print(sess.run(c))
print results:
可见:没有session.as_default(), with 之外sess自动关闭,sess.run(c)就报错
以上是关于session 和graph的总结,感谢参考文档的做者,这里做个学习笔记,小白一枚,欢迎你们指正,叩谢~~