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 ...
所以,靜態圖使用起來更快,更高效;而動態圖的優點是它更靈活,能給程序員更大的靈活度。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM