[翻译]第三章(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。

==简书翻译到此

    原文作者:斐波那契的数字
    原文地址: https://www.jianshu.com/p/27222440fdfe
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞