【TensorFlow重大升級】自動將Python程式碼轉為TFGraph,大幅簡化動態圖處理!
【新智元導讀】TensorFlow釋出重大功能改進AutoGraph,能自動將Python程式碼轉換為TensorFlow Graph,TF動態圖處理速度大幅提升!
今天,TensorFlow團隊釋出新功能“AutoGraph”,能自動將Python程式碼(包括控制流,print () 和其他Python原生特徵)轉換為純TensorFlow圖程式碼(pure TensorFlow graph code)。
不使用 Eager Execution編寫TensorFlow程式碼需要進行一些超程式設計(metaprogramming) ——先編寫一個建立圖(Graph)的程式,稍後再執行這個Graph。這可能令人困惑,尤其是對開發者新手來說。一些特別棘手的情況涉及更復雜的模型,比如要使用 if 和 while 的模型,或者有 print () 等副作用或接受結構化輸入的模型。
為什麼我們需要Graph呢?Graph允許各種優化,例如刪除常見的子表示式和融合核心(fusing kernel)。再者,Graph簡化了分散式訓練和部署到各種環境的過程,因為它們形成了獨立於平臺的模型計算過程。這對於模型在多個GPU或TPU上的分散式訓練尤為重要,如果你通過TensorFlow Lite、移動端、物聯網等其他平臺分發模型,Graph也很重要。
下面是一個很簡單的、你可能希望新增到Graph裡的操作:
def huber_loss(a):
if tf.abs(a) <= delta:
loss = a * a / 2
else:
loss = delta * (tf.abs(a) - delta / 2)
return loss
通過Eager Execution,只是能做到這一點,但是由於Python直譯器開銷(interpreter overheads)或錯過的程式優化機會,此類操作可能會很慢。
為了準備執行Graph,你需要重寫這個以使用像 tf.cond () 這樣的結構,但那樣實現起來可能會耗時耗力而且很困難。AutoGraph可以為自動執行此類轉換,將動態圖程式設計的簡易性保持很低的同時,獲得基於Graph執行的效能優勢。
在示例中,我們可以使用 autograph.convert () 來修飾函式,AutoGraph將自動生成 graph-ready 的程式碼。
使用AutoGraph,這段程式碼:
@autograph.convert()
def huber_loss(a):
if tf.abs(a) <= delta:
loss = a * a / 2
else:
loss = delta * (tf.abs(a) - delta / 2)
return loss
在執行時將變成這種樣子:
def tf__huber_loss(a):
with tf.name_scope(`huber_loss`):
def if_true():
with tf.name_scope(`if_true`):
loss = a * a / 2
return loss,
def if_false():
with tf.name_scope(`if_false`):
loss = delta * (tf.abs(a) - delta / 2)
return loss,
loss = ag__.utils.run_cond(tf.less_equal(tf.abs(a), delta), if_true,
if_false)
return loss
你可以直接呼叫程式碼,就像TensorFlow op一樣:
with tf.Graph().as_default():
x_tensor = tf.constant(9.0)
# The converted function works like a regular op: tensors in, tensors out.
huber_loss_tensor = huber_loss(x_tensor)
with tf.Session() as sess:
print(`TensorFlow result: %2.2f
` % sess.run(huber_loss_tensor))
綜上,AutoGraph填補了Eager Execution和Graph之間的空白。AutoGraph 將你的 eager-style Python 程式碼自動轉換為動態圖生成(graph-generating)程式碼。
AutoGraph不僅僅是一組有用的巨集指令(macro); 它涵蓋Python語言的任何部分(利用原始碼轉換),包括控制流、函式應用程式和賦值、生成模板程式碼以及重構常用的Python讓它易於轉換為圖形。
對於任何編譯器,都會擔心報錯資訊的可讀性; 為此,AutoGraph建立了報錯訊息和堆疊跟蹤,用來顯示原始原始碼中的錯誤源,而不僅僅是顯示對生成的程式碼的參考。
可執行的例子
那麼,AutoGraph可以為你做什麼呢? 以下是一些程式碼示例,它可以直接轉換為圖形程式碼而無需任何更改。 如果你想檢視完整的程式碼,我們有一個notebook,你可以在Colab或GitHub上檢視。
在這裡,我們使用迴圈和分支檢測Collatz猜想。 注意,我們使用AutoGraph的.to_graph()函式將其轉換為圖形的原因,是為了多樣性而不是為了裝飾。
def collatz(a):
counter = 0
while a != 1:
if a % 2 == 0:
a = a // 2
else:
a = 3 * a + 1
counter = counter + 1
return counter
graph_mode_collatz = autograph.to_graph(collatz)
# The code is human-readable, too
print(autograph.to_code(collatz))
collatz_tensor = graph_mode_collatz(tf.constant(n))
AutoGraph可以支援任意巢狀控制流,例如:
def f(n):
if n >= 0:
while n < 5:
n += 1
print(n)
return n
AutoGraph允許你將元素追加到迴圈內的陣列中。 為了達到這個要求,我們使用一些AutoGraph助手,例如set_element_type 和 stack。
def f(n):
z = []
# We ask you to tell us the element dtype of the list
autograph.set_element_type(z, tf.int32)
for i in range(n):
z.append(i)
# when you`re done with the list, stack it
# (this is just like np.stack)
return autograph.stack(z)
我們還支援像break,continue,甚至print和assert這樣的結構。 轉換後,該片段的Python將轉換為圖形(使用恰當的tf.Assert)。
def f(x):
assert x != 0, `Do not pass zero!`
return x * x
能夠輕鬆地新增迴圈,控制流程以及更多圖表意味著可以輕鬆地將訓練迴圈移動到圖形中。 這個例子可以在這個notebook中找到,我們採用RNN訓練迴圈並用一個sess.run()呼叫執行它。 在需要將整個訓練迴圈傳遞給加速器而不是通過CPU控制器管理訓練的情況下,這可能是很有用的。
AutoGraph開闢了構建和訓練模型的新思路。我們期待根據開發者社群的建議為AutoGraph新增更多功能,所以請提出你的建議和問題吧!
AutoGraph和Eager Execution
在使用eager execution時,你仍然可以通過tf.contrib.eager.defun對程式碼的某些部分使用圖執行。這要求你使用TensorFlow圖形操作,如tf.cond()。 將來,AutoGraph將與defun無縫整合,以允許在簡單的eager 風格的Python中創作圖形程式碼。 當該實現可用時,你可以通過選擇性地將eager程式碼轉換為graph fragments來使用AutoGraph加速熱點。
結論
AutoGraph是一款工具,可讓你輕鬆構建直觀,複雜的模型,在TensorFlow圖中輕鬆執行。 這是一個現在在contrib中的實驗工具,但我們希望儘快將其轉移到核心TensorFlow中。
告訴我們您使用AutoGraph的經歷! 如果你有反饋,建議或想法,請提交問題並向TensorFlow開發人員小組傳送訊息。
原文連結:https://medium.com/tensorflow/autograph-converts-python-into-tensorflow-graphs-b2a871f87ec7
原文釋出時間為:2018-07-19
本文來自雲棲社群合作伙伴新智元,瞭解相關資訊可以關注“AI_era”。
原文連結:【TensorFlow重大升級】自動將Python程式碼轉為TF Graph,大幅簡化動態圖處理!
相關文章
- SAP BW ODS無效字元自動處理程式【升級版】字元
- Python自動化處理Excel資料PythonExcel
- Imagination升級PowerVR圖形架構,高階移動裝置或將迎來重大升級VR架構
- Android 外掛化 動態升級Android
- 如何在 Python 中自動化處理 Excel 表格?PythonExcel
- 自動化開發:用深度學習5秒鐘將網站草圖轉換為HTML程式碼深度學習網站HTML
- 超級炫酷的3D旋轉動態圖——Python程式碼實現3DPython
- Python web自動化爬蟲-selenium/處理驗證碼/XpathPythonWeb爬蟲
- 自動化測試中的驗證碼處理
- 為實現電動車長途旅行,特斯拉超級充電站將大幅升級
- openrewrite/rewrite: 轉換升級Java或Spring程式碼的自動化工具JavaSpring
- 關閉chrome自動升級的教程 chrome如何取消自動升級Chrome
- Helix QAC—原始碼級靜態自動化測試工具原始碼
- oracle動態sql語句處理(轉)OracleSQL
- MonoDevelop 3.0 大幅改進 C# 程式碼自動完成MonodevC#
- java 自動升級sql指令碼 flyway 工具JavaSQL指令碼
- 自動化測試時對驗證碼的處理
- 【Python自動化Excel】pandas處理Excel的“分分合合”PythonExcel
- 這些自動化場景,批處理指令碼完全可以取代 Python指令碼Python
- [python] request 介面測試自動化指令碼轉化為 [locust] 效能測試指令碼Python指令碼
- JMeter 介面自動化測試(手工轉自動化指令碼)JMeter指令碼
- Win10自動升級將害慘野生動物 微軟崩潰Win10微軟
- .Net分表分庫動態化處理
- 如何用深度學習將前端設計模型自動轉換為程式碼?深度學習前端模型
- flyway實現java 自動升級SQL指令碼JavaSQL指令碼
- 使用Fortran實現當前驗證碼自動化處理
- 運動相機競爭升級:下一站模組化、自動化?
- 自動升級CentOS Python至官方最新版CentOSPython
- 批處理 自動修改 IP 地址(轉載)
- 【Python自動化Excel】pandas處理Excel資料的基本流程PythonExcel
- python將矩陣轉化為灰度圖Python矩陣
- TensorFlow 2.0將把Eager Execution變為預設執行模式,你該轉向動態計算圖了模式
- 基於Python的自動化程式碼審計Python
- 為了減少程式碼複雜度,我將if-else升級為面向狀態程式設計複雜度程式設計
- 汙水處理自動化控制與汙水處理廠集中控制
- python圖片處理類之~PIL.Image模組(ios android icon圖示自動生成處理)PythoniOSAndroid
- java 自動化與 python 自動化哪種程式語言吃香?JavaPython
- 動態圖和靜態圖的程式碼區別