Tensorflow Eager Execution入門指南

  • 2019 年 11 月 28 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_36670529/article/details/103121519

本文介紹了最新版的Tensorflow 1.7的功能及其使用方法,重點介紹其中最有趣的功能之一eager_execution,它許用戶在不創建靜態圖的情況下運行tensorflow程式碼。本文給出了使用eager_execution的步驟及一些注意事項,並不涉及理論知識,如果您已經對Tensorflow有所了解,那麼可以閱讀以下本文,它能指導您使用這個有趣的功能:

  1. 使用Eager Execution,你可以在沒有session的情況下運行你的程式碼
  2. 使用您自己的functions輕鬆解決梯度計算
  3. 支援將資料庫里的數據讀成用於實驗的數據集
  4. 對TensorRT的初始支援,以便您可以優化您的模型

最有趣的功能之一是eager_execution,允許用戶在不創建圖形的情況下運行tensorflow程式碼。 讓我們嘗試一個簡單的程式:

注意輸出是一個張量而不是實際的數組本身。為了得到數組值,你需要在session中運行它。正如您所知道的,創建大型神經網路時,您無法使用列印查看操作的輸出,從而增加了調試的複雜性。要檢查操作的輸出,您需要運行session並檢查session內的輸出:

現在讓我們換種方式再試一次:

現在通過使用tf.enable_eager_execution()可以獲得實際值。在eager_execution中,操作的輸出將是實際值而不是張量。但tf.enable_eager_execution的使用並不那麼簡單。 看看下一個例子。 下面是一段變數聲明:

所以聲明一個Tensorflow變數會引發一個錯誤,應該使用tf.contrib.eager.Variable。 這意味著我們不能在已有程式中使用Eager execution,並希望它能夠工作。為了使用eager實現功能,您需要更改您的程式碼。其中一個變化是,您可以使用tensorflow數據API來代替使用佔位符和變數將數據提供給模型。 這通常更快,更易於管理。 以下是一個函數,它可根據平整化的影像,標籤和批量大小(flattened images, labels and batch_size)來生成數據集。

現在讓我們試試這個函數。 我們得到下面的結果。 我們可以使用迭代器訪問數據集中的數據來進行批處理。

我們使用GradientTape記錄所有操作以便稍後應用於梯度更新。

grad()函數返回關於權重和偏差的損失的導數。然後將此傳遞給optimizer.apply_gradients()完成梯度下降的過程。除了上述變化外,幾乎所有東西都保持不變。 在使用eager execution之前,以下是一些關鍵點:

  1. 數據必須使用tensorcow.data.Dataset進行初始化。 (也可以使用其他方式,但不建議使用)
  2. eager execution默認在CPU上運行,要使用GPU,需要包含以下程式碼:with tf.device('/ gpu:0')
  3. eager execution不會創建張量圖,要構建圖只需要刪除tf.enable_eager_execution()即可
  4. eager execution對開發(R&D)有好處,但在生產環境中你應該使用graph execution。
  5. 您可以保存通過eager execution生成的模型,然後以graph 或eager execution的形式載入該模型。