ML框架中静态图和动态图区别

在现行的Python机器学习框架中,模型都是由两部分组成:张量Tensor和计算图。
计算图决定了整个模型数据流动的方向,和数据的组合方式。Tensor是在计算图中流动的数据。如下图:

流动的数据Tensor在所有现行框架中基本没什么区别,因为它就是单纯的数。各个框架之间的最大区别在于计算图的形式。这里被分成了动态图和静态图两种。
我们知道,计算图的生命周期是这样的:
Define -> Compile -> Use
静态图,严格按照先定义计算图再使用的规则来。compile和use被分离开来。就是说你要先编译这个图,生成binary file(也就是写死了这个图),才能用它。
动态图的编译和使用是一起发生的。就是说只有你在调用它进行计算时才会按情况调整后编译。

举例分析

  • 1 模型输入
    在Tensorflow 中我们定义一个卷积神经网络模型时,要求提供输入图像的宽度和高度信息,如input_shape=(256,256,3)。在编译后它就写死了,只能喂这个尺寸的图像进去。而在Torch中定义一个卷积神经网络模型时候,我们不需要写出输入图像的宽度高度信息。后面使用的时候,在保证channel数正确的前提下,可以喂不同尺寸的图像进去(当然一个batch内的数据必须独立同分布)。

  • 2 内部结构
    这是一段torch的代码:

import torch
first_counter = torch.Tensor([0])
second_counter = torch.Tensor([10])
while (first_counter < second_counter)[0]:
    first_counter += 2
    second_counter += 1
print(first_counter)
print(second_counter)

可以看出动态图的torch的计算流图是很自由的,可以变化,而tensorflow这样做的话会报错。

优缺点分析

静态图它是编译好再使用,所以它是Define -> Compile -> Use -> Use -> Use -> Use -> Use -> Use -> Use...
动态图是每次使用前编译,所以它是Define -> Compile -> Use -> Define -> Compile -> Use -> Define -> Compile -> Use ...
所以,静态图使用起来更快,更高效;而动态图的优点是它更灵活,能给程序员更大的灵活度。


原文地址:https://www.cnblogs.com/dynmi/p/13645162.html