剖析Tensorflow中,图的奥秘

4.4 实例19:图的基本操作

前面接触了一些图的概念,这里来系统的了解一下TensorFlow中的图可以做哪些事情。

案例描述

  1. 演示使用三种方式来建立图,并依次设置为默认图,使用get_default_graph方法来获取当前默认图,验证默认图的设置生效。
  2. 演示获取图中相关内容的操作。

一个TensorFlow程序是默认建立一个图的,除了系统自动建图以外,还可以手动建立,并做一些其他的操作。

4.4.1 建立图

可以在一个TensorFlow中手动建立其他的图,也可以根据图里面的变量获得当前的图。

下面代码中演示了:使用tf.Graph()建立图,使用tf.get_default_graph()获得图,还有使用reset_default_graph()来重置图。

代码4-14 图的基本操作

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

上面代码运行结果如下显示:

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

可以看出,

(1)c是在刚开始的默认图中建立的,所以它的图的打印值就是原始的默认图的打印值923CCF8,

(2)后来使用tf.Graph()建立了一个图B854940,并且在新建的图里添加变量,可以通过变量的“.graph”获得所在的图。

(3)在新图B854940的作用域外,使用tf.get_default_graph()又获得了原始的默认图923CCF8。接着又使用了tf.reset_default_graph()函数,它相当于从新建了一张图来代替原来的默认图,这时默认的图变成了B8546D8。

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

4.4.2 获取张量

在图里面可以通过名字得到其对应的元素,例如,get_tensor_by_name可以获得图里面的张量。

在上个实例中添加代码如下。

代码4-14 图的基本操作(续)

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

该部分代码运行结果如下显示:

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

常量C1是在一个子图g中建立的。with tf.Graph() as default代码表示使用tf.Graph()来创建一个图,并在其上面定义OP,见代码第5、6行。

接着演示了如何访问该图中的变量:将c1的名字放到get_tensor_by_name里面来反向得到其张量(见代码第20行),通过对t的打印可以看到所得的t就是前面定义的张量c1。

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

4.4.3 获取操作符

获取操作符(Operation,OP)的方法和获取张量的方法非常类似,使用的方法是get_operation_by_name()。下面将获取张量和获取OP的例子放在一起比较一下,具体见如下代码。

代码4-14 图的基本操作(续)

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

上面示例中,先将张量及其名字打印出来,然后使用g3图的get_tensor_by_name函数又获得到了该张量,此时test和tensor1是一样的。为了证明这一点,直接把test放到session的run里,发现它也能运行出正确的结果。

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

上面代码运行后会显示如下信息:

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

再仔细看上例中的op,通过打印tensor1.op.name的信息,获得了op的名字,然后通过get_operation_by_name获得了相同的op,可以看出op与tensor1之间的对应关系。

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

4.4.4 获取元素列表

如果想看一下图中的全部元素,可以使用get_operations()来实现。具体代码如下。

代码4-14 图的基本操作(续)

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

运行后显示如下信息:

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

由于g里面只有一个常量,所以打印了一条信息。

4.4.5 获取对象

前面是多根据名字来获取元素,还可以根据对象来获取元素。使用tf.Graph.as_graph_element(obj, allow_tensor=True, allow_operation=True)函数,即,传入的是一个对象,返回一个张量或是一个op。该函数具有验证和转换功能,在多线程方面会偶尔用到。举例如下。

代码4-14 图的基本操作(续)

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

运行输出结果如下:

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

上述的代码是将自己传进来,返回的仍然是自己,只是名字由c1变成了tt3。

《剖析Tensorflow中,图的奥秘》
《剖析Tensorflow中,图的奥秘》

更多章节请购买《深入学习之TensorFlow:入门、原理与进阶实战》

京东购买链接:http://t.cn/Rnx4s8d

关注公众号:相约机器人 图书配套视频在线观看

《剖析Tensorflow中,图的奥秘》

http://weixin.qq.com/r/VDjcxE-E1RKqrQun921G (二维码自动识别)

    原文作者:小白
    原文地址: https://zhuanlan.zhihu.com/p/37159459
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞