26.1_可视化代码的使用示例

26.1 可视化代码的使用示例

我们将在dezero/util.py中实现一个名为getDOT_graph的函数来可视化计算图。首先看一下该函数的使用示例。

import numpy as np  
fromdezero import Variable  
fromdezero.utils import getDOT_graph  
 $\mathbf{x0} =$  Variable(np.array(1.0))  
x1  $=$  Variable(np.array(1.0))  
y  $=$  x0+x1 #某种计算

命名变量

$\mathbf{x0}$  .name  $\equiv$  'x0'   
 $\mathbf{x1}$  .name  $=$  'x1'   
y.name  $=$  'y'   
txt  $\equiv$  get_dod_graph(y, verbose=False)   
print(txt)

保存为dot文件

with open('sample.dot', 'w') as o: o.write(txt)

运行结果

digraph g{   
4423761088 [label="y", color=orange, style=filled]   
4423742632 [label="Add", color=lightblue, style=filled, shape  $\equiv$  box]   
4403357456 -> 4423742632   
4403358016 -> 4423742632   
4423742632 -> 4423761088   
4403357456 [label  $=$  "x0", color=orange, style  $\equiv$  filled]   
4403358016 [label  $=$  "x1", color=orange, style  $\equiv$  filled]   
}

上面的代码将作为最终输出的变量y传给了get_DOT_graph函数。函数随后把从输出变量y开始的计算过程以用DOT语言编写的字符串的形式返回(后面会解释verbose参数)。另外,上面的代码在调用get_DOT_graph函数之前,通过x0.name='x0'和x1.name='x1'等设置了Variable实例的name属性。这几行代码的目的是在可视化计算图时,在变量节点上绘制标签名。

有了上面输出的字符串后,就可以把它写到sample.dot之类的文件中。这样一来,我们就可以在终端通过dot sample.dot -T png -o sample.png命令将其转换为图像。得到的图像如图26-1所示。


图26-1 计算图可视化的示例(参见彩图)

以上就是计算图的可视化流程。综上所述,我们要做的是用DOT语言编写从输出变量开始的计算过程。其实我们已经知道该怎么做了,因为在反向传播中实现的逻辑基本可以直接使用。

反向传播从输出变量开始回溯所有节点(变量和函数)。活用这个机制,我们就可以将计算图的节点转换为DOT语言。