Google Development Days China 2018近日在中國召開了。非常遺憾,小編因為不可抗性因素滯留在合肥,沒辦法去參加。但是小編的朋友有幸參加了會議,帶來了關於tensorlfow的一手資料。這裡跟隨小編來關注tensorflow在生產環境下的最佳應用情況。
Google Brain軟體工程師馮亦菲為我們帶來了題為“用Tensorflow高層API來進行模型原型設計、訓練和生產投入”的精彩報告。
馮亦菲姐姐給我們講了一些tensorflwo的新的API的變動,最重要的是提出了一些使用tensorflow的建議。
總結出來有六個方面,分別是:
-
用Eager模式搭建原型
-
用Datasets處理資料
-
用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屬於上面提出的第二種方式,可以簡化資料輸入過程,而且能夠提高資料的讀入效率。
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就可以輕鬆的實現。
如上圖所示,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。