2.2 图的实现
机器学习框架中“动态计算图”和“静态计算图”的含义分别是:支持动态计算图的叫动态框架,支持静态计算图的叫静态框架。当然,也有同时支持动态和静态的框架。
在静态框架中使用的是静态声明策略,计算图的声明和执行是分开的。在静态框架运行的方式下,先定义计算执行顺序和内存空间分配策略,然后执行过程按照规定的计算执行顺序和当前需求进行计算,数据就在这张实体计算图中计算和传递。常见的静态框架有TensorFlow、MXNet、Theano等。
而动态框架中使用的是动态声明策略,其声明和执行是一起进行的。动态框架可以根据实时需求构建对应的计算图,在灵活性上,动态框架会更胜一筹。Torch、DyNet、Chainer等是动态框架。
动态框架灵活性很好,但使用代价高,所以在现在流行的程序中,静态框架占比更重。静态框架将声明和执行分开的最大的好处是在执行前就知道了所有需要进行的操作,所以可以对图中各节点的计算顺序和内存分配进行合理规划,这样就可以较快地执行所需的计算。
有了张量和基于张量的各种操作之后,需要将各种操作整合起来输出结果。但随着操作种类和数量的增多,有可能引发各种意想不到的问题,包括多个操作之间应该并行还是顺次执行、如何协同各种不同的底层设备以及如何避免各种类型的冗余操作等。这些问题有可能拉低整个深度学习网络的运行效率或者引入不必要的Bug,计算图正是为解决这一问题而产生的。
一个使用TensorFlow编写的程序主要分为两个部分:一个是构建计算图部分,一个是执行计算图部分。下面来构建一个非常简单的计算图。
在上面的代码中,TensorFlow会自动将定义的计算转化成计算图上的节点,系统还会自动维护一个默认的计算图。可以通过下面的代码来获取当前默认的计算图:
TensorFlow提供了tf.Graph()方法来产生一个新的计算图,在不同的计算图中张量不会共享。如:
分别在计算图g1和g2中都定义张量c,在g1中初始化为0,在g2中初始化为1,从上面的代码可以看出,当运行不同的计算图时,张量c的值是不一样的。所以,在TensorFlow中可以通过计算图来隔离张量的运算。除此之外,TensorFlow还为计算图提供了管理张量的机制,我们可以设置运行是在GPU还是在CPU上进行,通过设置使用GPU可以加速运行,需要计算机上有GPU,如: