Google開發者大會:你不得不知的Tensorflow小技巧

Google Development Days China 2018近日在中國召開了。很是遺憾,小編由於不可抗性因素滯留在合肥,沒辦法去參加。可是小編的朋友有幸參加了會議,帶來了關於tensorlfow的一手資料。這裏跟隨小編來關注tensorflow在生產環境下的最佳應用狀況。react

Google Brain軟件工程師馮亦菲爲咱們帶來了題爲「用Tensorflow高層API來進行模型原型設計、訓練和生產投入」的精彩報告。程序員

image

馮亦菲姐姐給咱們講了一些tensorflwo的新的API的變更,最重要的是提出了一些使用tensorflow的建議。面試

image

總結出來有六個方面,分別是:
  • 用Eager模式搭建原型react-native

  • 用Datasets處理數據bash

  • 用Feature Columns提取特徵網絡

  • 用Keras搭建模型數據結構

  • 借用Canned Estimators框架

  • 用SavedModel打包模型函數

下面咱們依次來了解下這六個方面。學習

用Eager模式搭建原型

做爲計算機界的一份子,咱們知道靜態圖的效率天然是快快的,可是動態圖的使用爲咱們的使用帶來的不少方便。17年的時候,各大框架動態圖大行其道,因而Google提出了tf.contrib.eager應對挑戰。

使用Eager有什麼好處呢?回想以前咱們在調試tensorflow的程序時,不得不使用sess.run(),麻煩的要死,而使用Eager就能夠直接的將變量打印出來,大大方便了咱們的調試;好處不止這麼多,在進行模型搭建的時候,之前咱們須要仔細考慮下Tensor的shape,一旦出錯要定位也很不容易。而使用Eager能夠一邊搭建網絡結構,一邊將shape打印出來確認下是否正確。這就使咱們在搭建網絡時更加方面快捷了;此外,使用Eager後,自定義Operation和Gradient也會方便不少。

下面舉個簡單的小例子。首先使用pip install tf-nightly(或GPU版本pip install tf-nightly-gpu)來安裝Eager。

import tensorflow as tfimport tensorflow.contrib.eager as tfetfe.enable_eager_execution() #開啓Eager模式a = tf.constant([5], dtype=tf.int32)for i in range(a):   print (i)
複製代碼

使用Eager後咱們能夠很順利的執行上述代碼。可是若是沒有Eager,就會報Tensor對象不能解釋爲integer的錯誤。從缺點上來說,Eager的引入也勢必形成額外的成本。

用Datasets處理數據

tensorflow的數據讀入有三種方式:經過feeding的方式;經過管道(pipeline)的方式;直接讀取變量或常量中保存的數據。Datasets屬於上面提出的第二種方式,能夠簡化數據輸入過程,並且可以提升數據的讀入效率。

image

Datasets的組成如上如所示。其中:

  • Dataset:建立和轉換數據集的基本;

  • TextLineDataset:從文本文件中讀取行;

  • TFRecordDataset:讀取TFRecord文件;

  • FixedLengthRecordDataset:從二進制文件讀取固定大小的記錄;

  • Iterator:提供一種一次訪問一個數據集元素的方法。

對於Datasets的使用,咱們可使用Dataset的子類提供的方法,也能夠直接使用基類的方法:tf.data.Dataset.from_tensors()或者tf.data.Dataset.from_tensor_slices()。

用Feature Columns提取特徵

Feature Columns其實是一個數據結構,一個用於描述特徵的數據結構。利用Feature Columns能夠很方便的對輸入訓練模型前的特徵進行處理。好比鳶尾花的識別,對於輸入數據,每列表示不一樣的特徵,如花瓣的長度,花萼的長度等等,咱們想要對不一樣的列分別進行處理(或者對全部的列進行處理),使用Feature Columns就能夠輕鬆的實現。

image

如上圖所示,Feature Columns造成了對輸入數據集的結構性描述。能夠方便咱們對每列數據進行處理,並且使得代碼的可讀性更強。

用Keras搭建模型

想必你們對Keras已經比較瞭解了,使用Keras來構建一個神經網絡,簡直是飛通常地速度,並且完美的兼容tensorflow。

simple_model=Sequential()simple_model.add(Dense(3,input_shape=(x.shape[1],),activation='relu',name='layer1'))simple_model.add(Dense(5,activation='relu',name='layer2'))simple_model.add(Dense(1,activation='sigmoid',name='layer3'))
複製代碼

構建一個模型就是如上面這麼簡單,並且調用API中定義好的模型更是隻須要一句話,極其的方便。

借用Canned Estimators

Estimators API提供了模型選擇、評估、訓練等一些列功能。在1.3版本後,Google又增長了一層,稱之爲Canned Estimators。只須要一行代碼就可以建立深度模型。Estimators能夠結合上面提到的Feature Columns一塊兒使用。

tf.estimator.Estimator是基類;Pre-made Estimators是基類的子類,是已經定義好的模型,咱們能夠直接拿來使用;Custom Estimators是基類的實列,並非定義好的,須要咱們本身實現模型的定義。

對於這裏的模型,由三部分組成:

  • Input function:輸入函數,即咱們前面所說的Datasets,對於數據進行表示;

  • Model function: 實驗模型的訓練、驗證、測試以及監控模型的參數;

  • Estimators: 控制數據流以及模型的各類運算。

用SavedModel打包模型

相比於tensorflow原版的tf.train.Saver保存模型的方式,SavedModel提供了更好的將模型部署到生成環境的手段,更適用於商業目的。

如上圖右下方部分,在使用SavedModel打包模型時,能夠產生兩種模型:

對應於第一種模型,Tensorflow Model Analysis能夠方便咱們對模型進行分析,是否是存在參數的問題,抑或是模型哪裏設計的不合適等等;經過分析後,感受模型不錯,咱們就能夠經過Tensorflow Serving進行部署。

此外,相比於Saver的方式,咱們在inference時不須要再從新定義Graph(模型),若是使用Saver的話,在使用該模型時就須要再定義該模型,若是是一個程序猿設計並使用的還好,若是換成另外一個猿去用這個模型,他又不知道模型的tensor的狀況,那就尷尬了。因此使用SavedModel可讓咱們更輕鬆地去使用模型。

總結

Google Developer Days給咱們提供了一場盛宴,但願和你們一塊兒學習其中的知識。若是能夠,請爲這篇文章點個贊吧。聽說點讚的都能進Google。

閱讀更多

react-native技術的優劣

 一招教你讀懂JVM和Dalvik之間的區別

NDK項目實戰—高仿360手機助手之卸載監聽

(Android)面試題級答案(精選版)

非科班出身程序員:如何獲取職業資源、進入好公司?

相信本身,沒有作不到的,只有想不到的

在這裏得到的不只僅是技術!

相關文章
相關標籤/搜索