當前位置:
首頁 > 新聞 > TensorFlow中的命令式編程

TensorFlow中的命令式編程

機器之心報道

參與:晏奇



TensorFlow中的命令式編程

在標準TensorFlow庫中,計算規範根據計算圖靜態地完成,並且它與計算圖地執行相分離。這個編程地模型被稱為lazy、deferred、dynamic或者asynchronous。 這個庫將命令式編程方法(地址為:http://www.numpy.org/)引入了TensorFlow。使用該庫你可以:

以命令式編寫代碼:系統每執行一行代碼就會得到一個可用的結果。

在tensors上使用TensorFlow運算,獲得所有GPU加速的好處。

可以當編寫計算過程時,可以插入任意Python控制流語句如while 和 if。

用標準 tf.gradients (https://www.tensorflow.org/api_docs/python/train/gradient_computation#gradients) 函數在你的代碼上執行自動微分。(函數地址:https://www.tensorflow.org/api_docs/python/train/gradient_computation#gradients)

開始

這個庫是對標準TensorFlow Python庫的一個簡單包裝。源代碼在以下地址:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/imperative 。你可以通過在Linux上安裝鏈接GitHub主頁的nightly PIP包來開始。其它平台請參閱這份文檔(https://github.com/tensorflow/tensorflow#installation) ,PIP包也支持GPU。

寫下你的第一個命令式TensorFlow程序


$ python

>>> import tensorflow.contrib.imperative as tf>>> x = tf.constant([[7.], [6]])>>> y = tf.constant([[6., 7]])>>> tf.matmul(x, y)

array([[ 42., 49.],

[ 36., 42.]], dtype=float32)

請注意,這個代碼與就程序員對下述NumPy代碼的思維模型而言是相同的。


>>> import numpy as np>>> x = np.array([[7.], [6]])>>> y = np.array([[6., 7]])>>> x.dot(y)

array([[ 42., 49.],

[ 36., 42.]])

該庫以import tensorflow.contrib.imperative as tf 導入(它與導入TensorFLow的 import tensorflow as tf不同)。這個導入申明讓所有標準TensorFlow可用於 tf 記號。然而,不必須要創建會話對象,並設置它來運行和獲取張量。



特徵

該庫提供標準TensorFlow之上的如下進一步特徵:

當張量被在預測其值的文本中使用時,會被自動獲取。



列印


x = tf.constant(10)

y = tf.constant(32)print(x + y)42

使用條件語句


x = tf.constant(30)if x > 4:

print("Greater than 4")

Greater than 4

x = tf.random_normal([3])

y = x * 2while tf.global_norm([y]) < 1000:

y = y * 2print(y)

[ -213.2868042 -511.02456665 1026.66882324]

變數自動初始化,不需要運行tf.global_variables_initializer() 操作。

梯度如預期地使用標準tf.gradients函數工作。

x = tf.Variable(np.random.rand(1, 3))

y = tf.exp(x)

dy = tf.gradients(y, x)# dy/dx should be equal to y (= exp(x))print(y, dy)

(array([[ 1.79997761, 2.00581881, 2.37302414]]), [array([[ 1.79997761, 2.00581881, 2.37302414]])])

注意事項

該庫是在標準TensorFlow頂層之上的實現。它依然在後台建了一個計算圖,並按照操作執行。但是當一個操作第一次執行時,其結果會被放入緩存,並且緩存值會被返回以用於以後執行,因此它提供了必要的語義。由於這個實現選項,該庫存在以下注意事項:

使用內部Python循環:建立一個計算圖,並將其保留在後台,一方面是為了執行使用標準TensorFlow運行時間,另一方面是通過 tf.gradients允許自動微分。這意味著當TensorFlow函數被Python循環內部調用時,計算圖會持續增長。這個庫提供了一個 tf.new_step 方法,它可以清除計算圖和緩存中一直保存的用於梯度計算的張量。 tf.new_step可以被用上下文管理,例如,一個在每一次計算步驟之後清除計算圖的訓練循環。


x = tf.Variable(constant_op.constant(1.0))for i in range(10):

# Create a new training stepwith tf.new_step() as step:

# Perform computation and variable updates

step.run(tf.assign_sub(x, 0.1))

self.assertAllClose(tf.identity(x), 1.0 - (i + 1) * 0.1)

# The graph within this context is cleared at this point.

速度:冗餘的計算圖構造和冗餘的張量值緩存會增加開銷,這些開銷在標準TensorFlow中並不存在。在標準TensorFlow中,典型的計算圖會被構建一次,操作數次。我們開發該庫的目的是為了讓其作為實現TensorFlow命令式編程模型原型的媒介渠道。通過對也將同樣有利於延遲執行模式的運行時間大量的優化,運行時間的開銷可以被降低。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

新論文提出深度API編程器:可以學習使用API編程
DeepMind的強化學習:從無監督輔助到情境控制
Adobe圖像處理論文:開源iGAN到深度摳圖和風格轉換

TAG:機器之心 |

您可能感興趣

Foundation Joyride編程
JavaScript 編程Window Screen
JavaScript編程 Cookie
Foundation5 編程
JavaScript編程 Window Navigator
Python 中的非同步編程:Asyncio
React編程 Refs
Java Socket編程
AngularJS 編程
Highcharts編程
用 Python 3 的 async / await 做非同步編程
在Switch上編程遊戲,Fuze Code Studio公布
Flink DataStream編程指南及使用注意事項
JavaScript 中的面向對象編程
兒童編程語言MIT App Inventor編程
aeroMorph 一張可編程的「紙」
Android監測用戶行為之中AOP編程之AspectJ實戰
RedMonk 6 月編程語言排行:Java 第二,Kotlin 未入榜
Linux入門:Shell編程-字元截取命令-sed命令