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命令式編程模型原型的媒介渠道。通過對也將同樣有利於延遲執行模式的運行時間大量的優化,運行時間的開銷可以被降低。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※新論文提出深度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命令