[翻译]第三章(2)TensorFlow graphs

TensorFlow graphs (TensorFlow的图)

目前为止,我们只将“图”作为Tensorflow中某种抽象的、全方位的存在。甚至没有问过在我们开始编码时操作如何自动附加到图上。现在让我们看一些例子,并关注TensorFlow Graph 对象,学习一些例子到如何创建更多的图,如何使用多种图互相结合的例子。

创建一个图的例子---图的构造器不需要任何变量:

import tensorflow as tf

# Create a new graph:

g = tf.Graph()

一旦你的graph (图)初始化了,我们可以使用 Graph.as_default() 方法 获取他的上下文管理器, 并来添加操作(OPs)。结合with语句,我们可以使用上下文管理器糖TensorFlow知道我们要将操作添加到特定的图中:

可能你会问为什么之前的例子中,我们在添加Ops的时候不需要指定图呢?为了方便起见,TensorFlow在加载库的时候会自动创建图,并且将这个图指定为默认图。因此,在Graph.as_default()上下文管理器之外定义的任何操作、张量等都将会自动放置在默认图形中:

with g.as_default():

# Create Operations as usual; they will be added to graph `g`

a = tf.mul(2, 3)

# Placed in the default graph

in_default_graph = tf.add(1,2)

# Placed in graph `g`

with g.as_default():

in_graph_g = tf.mul(2,3)


如果你想要获得默认图的句柄,可以使用tf.get_default_graph()函数:

default_graph = tf.get_default_graph()

在大多数的TensorFlow程序中,都只是用默认图(graph)来处理。不过,当你定义的多个模型没有相互内在的依赖的情况下,创建多个图的时候很有用。当在一个文件中定义多个图形,它要么不使用默认的图形,要么立即处理分配给它的最佳实践。


Correct - Create new graphs, ignore default graph:

#正确的创建一个图,而不使用默认图

import tensorflow as tf

g1 = tf.get_default_graph()

g2 = tf.Graph()

with g1.as_default():

# Define g1 Operations, tensors, etc.


Incorrect: Mix default graph and user-created graph styles

#(不正确的方式)

import tensorflow as tf

g2 = tf.Graph()

# Define default graph Operations, tensors, etc.

...

with g2.as_default():

# Define g2 Operations, tensors, etc.

...

TensorFlow Sessions

正如之前的练习中所讨论的一样,Session(会话)是负责graph(图)执行的。其构造函数函数 

有三个可选参数:

 target  指定要使用的引擎。对于很多应用来说,其默认值是空字符串。当在一个分布式的设置中使用的session , 这个参数会用于连接 tf.train.Server 实例 (会在本书最后一张提及)

 graph 指定在session中要加载的Graph 对象。

 config 允许用户选择session的配置,例如限制CPU或者是GPU的使用数量,设置图中的优化参数、日志选项。在典型的tensorflow程序中,session对象的创建可以不需要修改任何默认参数。

PS: 这参数对实验调试很有帮助, 可以控制CPU 、 GPU 的核数


import tensorflow as tf

# 用默认的图创建操作、tensor 等

a = tf.add(2, 5)

b = tf.mul(a, 3)

# 在默认图中开启session

sess = tf.Session()

注意,这两种调用是有区别的:


sess = tf.Session()

sess = tf.Session(graph = tf.get_default_graph() )

一旦一个session开启,你可以使用它主要的方法run()来计算期望的tensor输出:

sess.run(b) # 返回结果21

Session.run() 需要一个参数--fetches , 同时也有三个可选参数:feed_dict, options 和run_metadata 。由于run_metadata和options在试验中至今还没有用到,并且时间有限, 我们不会覆盖options 或者run_metadata的讲解。 但是feed_dict需要重点理解,后面会讲到。

Fetches

fetches 可以接受任何图中的用户想要执行的元素(既可以是操作Operation,也可以是Tensor)。假如所需的对象的一个Ten 那么 run() 输出的结果将会是一个Numpy 数组(array)。如果这个所需的 对象时Operation, 那么输出的结果是None。

在上面的例子中,我们设置fetches 给tensor b(是tf.mul()操作的输出)。这是告诉Tensorflow:这个Session应该找到计算b的值所需要的节点,并按照计算顺序执行,最后输出b。我们可以传递的值输一个图的元素:

```python

sess.run([a,b]) ## 返回值的是  [7, 21]

```

当fetchs是一个列表,run() 的输出结果将会是也将是列表,这个列表的值是响应元素的输出。在本例中,我们要求的是a和b的顺序值。 由于a和b都是tensor(张量),我们会接受他们的值,并且作为输出。

除了可以使用fetches来获取Tensor的输出以外, 我们也会看到例子中我们给fetchs 一个引用着Operation 的字典(direct),在运行的时候会很有用。这个例子中的tf.initialize_all_variables()

是用于对所有的Tensorflow 变量(variable)的并行化做准备用的(variable 对象会在最后一节涉及到)。我们依旧将Op作为fetches的参数传递。但是Session.run() 的返回结果将会是None:

```python

## 准备计算所需要初始化的变量,但是返回结果将会是‘None’

sess.run(tf.initialize_all_variables())

```

Feed dictionary

feed_dict参数可以使用图中的Tensor值来覆盖(overide),这可以看做将一个python字典对象作为输入。字典的key是引用的Tensor对象,可以被覆盖,key的值可以是数字、字符串、列表以及Numpy 数组(之前也提到过)。字典中的value必须是与tensor 的key是同一类型(或者是可以转化为统一类型)。让我们展示一下如何使用feed_dict 覆盖之前graph 中 a的值:

```python

import tensorflow as tf

## 创建操作、tensor 等等(使用的是默认图)

a = tf.add(2,3)

b = tf.mul(a,3)

## 使用默认的图开启一个'Session'

sess = tf.Session()

## 定义一个字典用于取代原来的值a=15

replace_dict={a:15}

# 传递参数 repalce_dict 作为 feed_dict  的值:

sess.run(b, feed_dict=replace_dict) # 返回 45

```

PS: 这里的dict是python 中的一个数据结构,这种数据结构类似于java里的map, 都是key-value形式的,简称为键值对形式, 这里为了区别术语就直接使用key、value。

注意即使a会被正常的计算为7 , 我们传递到deed_dict 中的字典会将值替换成15。 feed_dict 在很多环境下极其的有用。由于tensor的值是是之前提供的,这个图不需要计算任何tensor的正常依赖。这就意味着如果你有一个巨大的图并且想要用假数据(虚拟值dummy value)测试图的一部分,tensorflow不会把时间浪费在不必要的计算中。 feed_dict 在指定输入值得时候也是很用的,我们会在将在即将到来的占位符部分中介绍。

当你使用完了session, 应该调用它的close() 方法去释放资源:

```python

#  开启会话

sess = tf.Session()

#  运行图、 写统计摘要等等

.....

# 关闭图

sess = close()

```

我们也可以使用as_default() 方法把 Session 当做上下文管理器(Context Manager)来使用。类似通过某种操作可以隐式的使用Graph 对象。你可以将某个会话设置为由某些函数自动使用。最常见的函数是 Operation.run() 和 Tensor.eval()  , 这些动作可以看做是你已经把他们传递给了Session.run()了。

```python

# 定义一个普通的变量

a = tf. constant( 5)

# 开启一个会话

sess = tf. Session( )

#  使用with代码块, 将Session 作为内部默认的会话

with sess. as_default( ) :

a. eval( ) # 自动关闭

# 不得不手动的关闭

sess. close( )



MORE on INTERACTIVESESSION

在这本书的前面我们提到过InteractiveSession(互动会话)  是TensorFlow  session 的另一种类型,但是我们不会用到它。所有的InteractiveSession 又会在运行的时候都会自动地将自己设置为默认session。当使用交互式的Python Shell 的时候却很方便,因为你可以使用a.eval() 或者a.run() 而不必显式的输出sess.run([a])。不过,如果你要拼凑多个session的话,这会有一点棘手。维护一致的图形使得调试更加容易,所以我们坚持使用常规的Session对象。

现在我们已经对运行图形有了很好的理解,让我们看看如何正确地指定输入节点并结合使用feed_dict。



==简书翻译到此

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 8月12日 导师班第三天,仿佛重生一般。以后我将带着一颗清明的心看到这个简单的世界,从此人生无大事。林青贤院长的导...
    成功的种子阅读 387评论 0 0
  • 文:ruesunny 01 昨天,工作忽然忙起来,临时替补做自己不擅长的事。打电话,协调事情,准备材料等等。脑袋里...
    平白书阅读 648评论 4 16
  • 月光 是给暗夜里舔舐伤口的怯缩者 照明用的
    赵梦琦阅读 647评论 0 50