Graph
在前面的文章中,我们学会了如何在TensorFlow(TF)中创建Tensor,Variable和Operation来组成一个graph,以及如何利用Session运行一个graph。但是这个graph对象究竟是在什么时候创建的?我们能否同时创建多个graph呢?
要回答这个问题,我们首先要了解在默认的情况下,TF是如何创建graph的。TF在library加载以后,会自动创建一个Graph对象,并把它作为default graph,我们创建的操作会自动放在这个default graph里。我们也可以不使用TF自动创建的graph,而是创建自己的graph对象并设置为default,然后添加各种操作,例如:
注意,如果打算运行自己创建的graph,一定要把它传递给
tf.Session
的graph
参数。
我们也可以自己创建多个Graph对象,将它设为default graph后,添加各种操作:
name scopes and TensorBoard
到目前为止,我们学习了创建TF graph所需的所有原材料。前面的例子都很简单,一个graph中只有几个节点,然而在实际工作中,我们需要创建包含成百上千个节点的graph。如何有效的组织和查看graph就显得尤为重要。在TF中,我们可以通过name scope的方式来组织节点,并利用TensorBoard来可视化。
name scopes的作用就是把相关的操作组织在一起,形成一个大的block。在TensorBoard中查看graph的时候,会发现所有的节点都被封装在一个个block中。
我们先来利用name scope创建一个简单的graph,并保存在文件中:
接着在终端中启动TensorBoard:
$ tensorboard --logdir='./name_scope_1'
打开浏览器,在地址栏中输入http://127.0.1.1:6006
,点击GRAPH标签,就可以看到下面的结果:
此时我们只能看到两个box,分别代表的是我们定义的两个name scope,我们点击box右上角的+号,就可以展开box,看到里面的节点:
接下来我们创建一个更复杂一些的graph:
在TensorBoard中我们可以清楚的看到:Transformation scope包含了4个scope,这4个scope又分成了2层(用不同的颜色表示),第一层的A和B把它们的output传给了第二层的C和D,然后C和D把它们的output传给了最后一个节点。
我们可以进一步查看4个scope内部的结构:
从这个例子可以看到,将复杂的网络分解成各个block和layer,可以让我们快速地理解网络的结构。
我们通过简单的例子学习了TensorFlow中的一些最基本的概念。这是我们看懂TF代码的前提条件,也是向构建复杂神经网络迈出的坚实一步。预知后事如何,且听下回分解!
参考文献
- Giancarlo Zaccone. Getting Started with TensorFlow, 2016
- Sam Abrahams et al. TensorFlow for Machine Intelligence: A Hands-On Introduction to Learning Algorithms, 2016