當前位置:
首頁 >
pytorch命令式和符号式混合编程
發布時間:2024/8/23
46
豆豆
生活随笔
收集整理的這篇文章主要介紹了
pytorch命令式和符号式混合编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
命令式和符號式編程
命令式編程
命令式編程使用編程語句改變程序狀態,如下:
def add(a, b):return a + bdef fancy_func(a, b, c, d):e = add(a, b)f = add(c, d)g = add(e, f)return gfancy_func(1, 2, 3, 4) # 10在運行語句e = add(a, b)時,Python會做加法運算并將結果存儲在變量e中,從而令程序的狀態發生改變。類似地,后面的兩條語句f = add(c, d)和g = add(e, f)會依次做加法運算并存儲變量。
雖然使用命令式編程很方便,但
- 它的運行可能很慢
- 即使fancy_func函數中的add是被重復調用的函數,Python也會逐一執行這3條函數調用語句。
- 需要保存變量e和f的值直到fancy_func中所有語句執行結束。這是因為在執行e = add(a, b)和f = add(c, d)這2條語句之后我們并不知道變量e和f是否會被程序的其他部分使用。
符號式編程
與命令式編程不同,符號式編程通常在計算流程完全定義好后才被執行。多個深度學習框架,如Theano和TensorFlow,都使用了符號式編程。通常,符號式編程的程序需要下面3個步驟:
- 定義計算流程;
- 把計算流程編譯成可執行的程序;
- 給定輸入,調用編譯好的程序執行。
下面我們用符號式編程重新實現之前的命令式編程代碼。
def add_str():return ''' def add(a, b):return a + b '''def fancy_func_str():return ''' def fancy_func(a, b, c, d):e = add(a, b)f = add(c, d)g = add(e, f)return g '''def evoke_str():return add_str() + fancy_func_str() + ''' print(fancy_func(1, 2, 3, 4)) '''prog = evoke_str() print(prog) y = compile(prog, '', 'exec') exec(y)以上定義的3個函數都僅以字符串的形式返回計算流程。最后,我們通過compile函數編譯完整的計算流程并運行。
由于在編譯時系統能夠完整地獲取整個程序,因此有更多空間優化計算。例如,編譯的時候可以將程序改寫成print((1 + 2) + (3 + 4)),甚至直接改寫成print(10)。這樣不僅減少了函數調用,還節省了內存。
對比
對比這兩種編程方式,我們可以看到以下兩點。
- 命令式編程更方便。當我們在Python里使用命令式編程時,大部分代碼編寫起來都很直觀。同時,命令式編程更容易調試。這是因為我們可以很方便地獲取并打印所有的中間變量值,或者使用Python的調試工具。
- 符號式編程更高效并更容易移植。一方面,在編譯的時候系統容易做更多優化;另一方面,符號式編程可以將程序變成一個與Python無關的格式,從而可以使程序在非Python環境下運行,以避開Python解釋器的性能問題。
大部分深度學習框架在命令式編程和符號式編程之間二選一。例如,Theano和受其啟發的后來者TensorFlow使用了符號式編程,Chainer和它的追隨者PyTorch使用了命令式編程,而Gluon則采用了混合式編程的方式。
PyTorch僅僅采用了命令式編程
總結
以上是生活随笔為你收集整理的pytorch命令式和符号式混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉诺塔java程序_Java编写一个汉诺
- 下一篇: 代价敏感多标签主动学习的代码开发跟踪