[翻译]第三章(2)TensorFlow graphs
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[翻译]第三章(2)TensorFlow graphs相关的知识,希望对你有一定的参考价值。
参考技术A 目前为止,我们只将“图”作为Tensorflow中某种抽象的、全方位的存在。甚至没有问过在我们开始编码时操作如何自动附加到图上。现在让我们看一些例子,并关注TensorFlow Graph 对象,学习一些例子到如何创建更多的图,如何使用多种图互相结合的例子。创建一个图的例子---图的构造器不需要任何变量:
一旦你的graph (图)初始化了,我们可以使用 Graph.as_default() 方法 获取他的上下文管理器, 并来添加操作(OPs)。结合with语句,我们可以使用上下文管理器糖TensorFlow知道我们要将操作添加到特定的图中:
可能你会问为什么之前的例子中,我们在添加Ops的时候不需要指定图呢?为了方便起见,TensorFlow在加载库的时候会自动创建图,并且将这个图指定为默认图。因此,在Graph.as_default()上下文管理器之外定义的任何操作、张量等都将会自动放置在默认图形中:
如果你想要获得默认图的句柄,可以使用tf.get_default_graph()函数:
在大多数的TensorFlow程序中,都只是用默认图(graph)来处理。不过,当你定义的多个模型没有相互内在的依赖的情况下,创建多个图的时候很有用。当在一个文件中定义多个图形,它要么不使用默认的图形,要么立即处理分配给它的最佳实践。
正如之前的练习中所讨论的一样,Session(会话)是负责graph(图)执行的。 其构造函数函数
有三个可选参数:
target 指定要使用的引擎。对于很多应用来说,其默认值是空字符串。当在一个分布式的设置中使用的session , 这个参数会用于连接 tf.train.Server 实例 (会在本书最后一张提及)
graph 指定在session中要加载的Graph 对象。
config 允许用户选择session的配置,例如限制CPU或者是GPU的使用数量,设置图中的优化参数、日志选项。在典型的tensorflow程序中,session对象的创建可以不需要修改任何默认参数。
PS: 这参数对实验调试很有帮助, 可以控制CPU 、 GPU 的核数
注意,这两种调用是有区别的:
一旦一个session开启,你可以使用它主要的方法run()来计算期望的tensor输出:
Session.run() 需要一个参数--fetches , 同时也有三个可选参数:feed_dict, options 和run_metadata 。由于run_metadata和options在试验中至今还没有用到,并且时间有限, 我们不会覆盖options 或者run_metadata的讲解。 但是feed_dict需要重点理解,后面会讲到。
fetches 可以接受任何图中的用户想要执行的元素(既可以是操作Operation,也可以是Tensor)。假如所需的对象的一个Ten 那么 run() 输出的结果将会是一个Numpy 数组(array)。如果这个所需的 对象时Operation, 那么输出的结果是None。
在上面的例子中,我们设置fetches 给tensor b(是tf.mul()操作的输出)。这是告诉Tensorflow:这个Session应该找到计算b的值所需要的节点,并按照计算顺序执行,最后输出b。我们可以传递的值输一个图的元素:
```python
```
当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
```
feed_dict参数可以使用图中的Tensor值来覆盖(overide),这可以看做将一个python字典对象作为输入。字典的key是引用的Tensor对象,可以被覆盖,key的值可以是数字、字符串、列表以及Numpy 数组(之前也提到过)。字典中的value必须是与tensor 的key是同一类型(或者是可以转化为统一类型)。让我们展示一下如何使用feed_dict 覆盖之前graph 中 a的值:
```python
```
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
.....
```
我们也可以使用as_default() 方法把 Session 当做上下文管理器(Context Manager)来使用。类似通过某种操作可以隐式的使用Graph 对象。你可以将某个会话设置为由某些函数自动使用。最常见的函数是 Operation.run() 和 Tensor.eval() , 这些动作可以看做是你已经把他们传递给了Session.run()了。
```python
MORE on INTERACTIVESESSION
在这本书的前面我们提到过InteractiveSession(互动会话) 是TensorFlow session 的另一种类型,但是我们不会用到它。所有的InteractiveSession 又会在运行的时候都会自动地将自己设置为默认session。当使用交互式的Python Shell 的时候却很方便,因为你可以使用a.eval() 或者a.run() 而不必显式的输出sess.run([a])。不过,如果你要拼凑多个session的话,这会有一点棘手。维护一致的图形使得调试更加容易,所以我们坚持使用常规的Session对象。
现在我们已经对运行图形有了很好的理解,让我们看看如何正确地指定输入节点并结合使用feed_dict。
==翻译到此
以上是关于[翻译]第三章(2)TensorFlow graphs的主要内容,如果未能解决你的问题,请参考以下文章
翻译: Keras 标准化:TensorFlow 2.0 中高级 API 指南