tensorflow编程: Running Graphs

Session management

tf.Session

Class Session

  A class for running TensorFlow operations.   这是一个类,执行 tensorflow 中的 op 。它里面定义了 run()extend()close()__init__() 等方法。

  简而言之,就是 用户使用tensorflow时交互的接口。   通过类内定义的方法 如 extend() 创建新的边和节点,以创建新的图;通过 run() 执行。

  Tensorflow以Session接口类这个C API为边界,将系统分为 前端 和 后端 两个 子系统。后端 = sess.run(前端) 。   前端: 支持多语言的编程环境,能够提供计算图的编程模型。通过Session接口为桥梁,连接tensorflow后端的运行时 , 并启动计算图的执行过程。   后端: 根据Session().run()中的fetches参数,从计算图中反向遍历,找到所依赖的最小子图,将子图分裂成“子图片段”,分发给worker们(如gpu_0、gpu_1、cpu_0等)。所有worker按流程执行子图片段。

  若创建 Session 时没有指定Graph,则会加载默认的Graph。   若 一个进程 中有多个图,我们就需要定义创建不同的 Session 来加载不同的图;对于同一个 Graph 可以加载不同的 Session

sess = tf.Session() ,此时 sess 成了 Session 类的实例。

  Session 可能拥有的资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase。在不再需要这些资源时,重要的是释放这些资源,即调用 Session类 中的 tf.Session.close,也可以在with所创造的上下文管理器中直接run,结束的时候不需要 close Session 的额外操作。以下两个例子是等效的:

# 正常流程
sess = tf.Session()
sess.run(...)
sess.close() # 记得要有这句,否则不会释放。

# 使用上下文管理器
with tf.Session() as sess:
  sess.run(...)

tf.Session.init(target=”, graph=None, config=None)

tf.Session.run(fetches, feed_dict=None, options=None, run_metadata=None)

  初始化时就已经赋值过了:

import tensorflow as tf

node1 = tf.constant(value=[1, 2], dtype=tf.int32)
node2 = tf.constant(value=[3, 4], dtype=tf.int32)
c = tf.multiply(node1, node2)

tf.global_variables_initializer()
print (node1, node2, c)
print (tf.Session().run(c))
print (tf.Session().run(fetches=node1), tf.Session().run(fetches=node2), tf.Session().run(fetches=c))
tf.Session().close()
(<tf.Tensor 'Const:0' shape=(2,) dtype=int32>, <tf.Tensor 'Const_1:0' shape=(2,) dtype=int32>, <tf.Tensor 'Mul:0' shape=(2,) dtype=int32>)

[3 8]

(array([1, 2], dtype=int32), array([3, 4], dtype=int32), array([3, 8], dtype=int32))

  后期执行 run() 时,通过 feed_dict参数 进行赋值:

import tensorflow as tf

node1 = tf.placeholder(dtype=tf.int32, shape=(2,))
node2 = tf.placeholder(dtype=tf.int32, shape=(2,))
c = tf.multiply(node1, node2)

tf.global_variables_initializer()
print (node1, node2, c)
print (tf.Session().run(fetches=c, feed_dict={node1:[1, 2], node2:[3, 4]}))
print (tf.Session().run(fetches=node1, feed_dict={node1:[1, 2]}),
       tf.Session().run(fetches=node2, feed_dict={node2:[3, 4]}),
       tf.Session().run(fetches=c, feed_dict={node1:[1, 2], node2:[3, 4]}))
tf.Session().close()
(<tf.Tensor 'Const:0' shape=(2,) dtype=int32>, <tf.Tensor 'Const_1:0' shape=(2,) dtype=int32>, <tf.Tensor 'Mul:0' shape=(2,) dtype=int32>)

[3 8]

(array([1, 2], dtype=int32), array([3, 4], dtype=int32), array([3, 8], dtype=int32))

tf.InteractiveSession

Class InteractiveSession

  第一种 eval() 用法:

import tensorflow as tf

sess = tf.InteractiveSession() ###
a = tf.constant(5)
b = tf.constant(6)
c = a * b
# 通过使用 'c.eval()' 可以免去 'sess'
print(c.eval()) ###
sess.close() ###
30

  第二种 eval() 用法:

import tensorflow as tf

a = tf.constant(5)
b = tf.constant(6)
c = a * b
with tf.Session(): ###
    # 这里 tf.Session() 不可替换为 tf.InteractiveSession(), 具体原因我也不知道,以后再探究
    print(c.eval()) ###
30


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动端开发

Swift 2.0 单例的用法

单例我们项目中是很常用的,今天刚学了在swift中怎么写单例和调用单例。下面我们简单的介绍一下。我们先看看Swift单例的写法: import UIKit c...

20580
来自专栏数据结构与算法

利用MingW检验程序运行内存

今天zhx老师在讲课的时候提到了一种检验程序内存的方法 一般计算内存的方法就是手算,手动计算代码中每个变量所占的内存然后加起来 具体可以参考这篇文章 zhx老师...

29060
来自专栏木头编程 - moTzxx

PHP 无限级分类数据库设计及实现

55420
来自专栏james大数据架构

springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected sin

在springmvc中注入服务时用@Service 当有两个实现类时都标明@Service后则会出现异常: nested exception is org.sp...

23870
来自专栏大数据杂谈

非常实用的九个程序员工具网站

26240
来自专栏程序员的知识天地

Python实现一个代码行数统计工具

我们经常想要统计项目的代码行数,但是如果想统计功能比较完善可能就不是那么简单了, 今天我们来看一下如何用python来实现一个代码行统计工具。

34410
来自专栏python学习指南

python_IO编程

本篇文章将介绍python里面的I/O编程。更多内容请参考:python学习指南 I/O编程 读写文件时最常见的IO操作。Python内置了读写文件的函数...

25360
来自专栏Linux驱动

12.Linux之输入子系统分析(详解)

在此节之前,我们学的都是简单的字符驱动,涉及的内容有字符驱动的框架、自动创建设备节点、linux中断、poll机制、异步通知、同步互斥/非阻塞、定时器去抖动。 ...

33060
来自专栏Python私房菜

60行Python代码,实现多线程PDF转Word

工作中经常会遇到需要提取PDF文件中文字的情况,一个PDF还好,复制粘贴一下也花不了太多时间,如果需要把大量PDF转为Word,怎么办呢?

18830
来自专栏linux驱动个人学习

动态链接

要解决空间浪费和更新困难这两个问题最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态地链接在一起。简单地讲,就是不对那些组成程序的目标文...

24020

扫码关注云+社区

领取腾讯云代金券