天天看點

一步步帶你探究如何高效使用TensorFlow

<b>tensorflow基礎知識:</b>

tensorflow和其他數字計算庫(如numpy)之間最明顯的差別在于tensorflow中操作的是符号。這是一個強大的功能,這保證了tensorflow可以做很多其他庫(例如numpy)不能完成的事情(例如自動區分)。這可能也是它更複雜的原因。今天我們來一步步探秘tensorflow,并為更有效地使用tensorflow提供了一些指導方針和最佳實踐。

我們從一個簡單的例子開始,我們要乘以兩個随機矩陣。首先我們來看一下在numpy中如何實作:

現在我們使用tensorflow中執行完全相同的計算:

與立即執行計算并将結果複制給輸出變量z的numpy不同,tensorflow隻給我們一個可以操作的張量類型。如果我們嘗試直接列印z的值,我們得到這樣的東西:

由于兩個輸入都是已經定義的類型,tensorflow能夠推斷張量的符号及其類型。為了計算張量的值,我們需要建立一個會話并使用session.run方法進行評估。

要了解如此強大的符号計算到底是什麼,我們可以看看另一個例子。假設我們有一個曲線的樣本(例如f(x)= 5x ^ 2 + 3),并且我們要估計f(x)在不知道它的參數的前提下。我們定義參數函數為g(x,w)= w0 x ^ 2 + w1 x + w2,它是輸入x和潛在參數w的函數,我們的目标是找到潛在參數,使得g(x, w)≈f(x)。這可以通過最小化損失函數來完成:l(w)=(f(x)-g(x,w))^ 2。雖然這問題有一個簡單的封閉式的解決方案,但是我們選擇使用一種更為通用的方法,可以應用于任何可以區分的任務,那就是使用随機梯度下降。我們在一組采樣點上簡單地計算相對于w的l(w)的平均梯度,并沿相反方向移動。

以下是在tensorflow中如何完成:

通過運作這段代碼,我們可以看到下面這組資料:

這與我們的參數已經相當接近。

這隻是tensorflow可以做的冰山一角。許多問題,如優化具有數百萬個參數的大型神經網絡,都可以在tensorflow中使用短短的幾行代碼高效地實作。而且tensorflow可以跨多個裝置和線程進行擴充,并支援各種平台。

<b>了解靜态形狀和動态形狀的差別:</b>

tensorflow中的張量在圖形構造期間具有靜态的形狀屬性。例如,我們可以定義一個形狀的張量[none,128]:

這意味着第一個次元可以是任意大小的,并且将在session.run期間随機确定。tensorflow有一個非常簡單的api來展示靜态形狀:

為了獲得張量的動态形狀,你可以調用tf.shape op,它将傳回一個表示給定形狀的張量:

我們可以使用tensor.set_shape()方法設定張量的靜态形狀:

<code>a.set_shape([32, 128])</code>

實際上使用tf.reshape()操作更為安全:

這裡有一個函數可以友善地傳回靜态形狀,當靜态可用而動态不可用的時候。

現在想象一下,如果我們要将三維的張量轉換成二維的張量。在tensorflow中我們可以使用get_shape()函數:

請注意,無論是否靜态指定形狀,都可以這樣做。

實際上,我們可以寫一個通用的重塑功能來如何次元之間的轉換:

然後轉化為二維就變得非常容易了:

廣播允許我們執行隐藏的功能,這使代碼更簡單,并且提高了記憶體的使用效率,因為我們不需要再使用其他的操作。為了連接配接不同長度的特征,我們通常平鋪式的輸入張量。這是各種神經網絡架構的最常見模式:

這可以通過廣播機制更有效地完成。我們使用f(m(x + y))等于f(mx + my)的事實。是以我們可以分别進行線性運算,并使用廣播進行隐式級聯:

實際上,這段代碼很普遍,隻要在張量之間進行廣播就可以應用于任意形狀的張量:

到目前為止,我們讨論了廣播的好的部分。但是你可能會問什麼壞的部分?隐含的假設總是使調試更加困難,請考慮以下示例:

你認為c的數值是多少如果你猜到6,那是錯的。這是因為當兩個張量的等級不比對時,tensorflow會在元素操作之前自動擴充具有較低等級的張量,是以加法的結果将是[[2,3], [3,4]]。

如果我們指定了我們想要減少的次元,避免這個錯誤就變得很容易了:

這裡c的值将是[5,7]。

<b>使用</b><b>python</b><b>實作原型核心和進階可視化的操作:</b>

例如,這是python如何在tensorflow中實作一個簡單的relu非線性核心:

要驗證梯度是否正确,你可以使用tensorflow的梯度檢查器:

compute_gradient_error()是以數字的方式計算梯度,并傳回與漸變的差異,因為我們想要的是一個很小的差異。

請注意,此實作效率非常低,隻對原型設計有用,因為python代碼不可并行化,不能在gpu上運作。

在實踐中,我們通常使用python ops在tensorboard上進行可視化。試想一下你正在建構圖像分類模型,并希望在訓練期間可視化你的模型預測。tensorflow允許使用函數tf.summary.image()進行可視化:

但這隻能顯示輸入圖像,為了可視化預測,你必須找到一種方法來添加對圖像的注釋,這對于現有操作幾乎是不可能的。一個更簡單的方法是在python中進行繪圖,并将其包裝在一個python 方法中:

請注意,由于概要通常隻能在一段時間内進行評估(不是每步),是以實施中可以使用該實作,而不用擔心效率。

文章原标題《effective tensorflow - guides and best practices for effective use of tensorflow》

作者:<b>vahid kazemi</b> 作者是<b>google的</b>件工程師,cs中的博士學位。從事機器學習,nlp和計算機視覺工作。

譯者:袁虎 審閱:

繼續閱讀