本節課分為兩部分,第一部分介紹tensorflow中estimator和特征列的API的使用,estimator是和keras平級的用於模型抽象的高級API,會使用泰坦尼克生存預測項目來詳細的講解特征抽取和estimator使用。學習完以上的基礎知識后,在第二部分中會講解tf1.0的知識點來方便大家對比2.0與1.0的區別。
第一章到第五章是本門課程的基礎內容,掌握了這5章就掌握了tensorflow的基本使用方法,1-5章主要講的是tensrflow2.0,講完第五章estimator內容之后,再講一下1.0的一些東西.
課程引入
keras搭建的model轉成estimator;
使用一些預定義的estimator(BaseLineClassifier,基線模型,通過隨機猜測的方式進行預測;LinearClassifier,是一個線性模型;DNNClassifier,是一個深度全連接的神經網路的分類器),他們都有對應的Regression用於回歸問題;
Tf.feature_column做特征工程,它是用來組織數據的,會把數據表達成一個一個的feature,然后對這些feature做一些操作,比如說one-hot編碼、embadding等等。
講tf.estimator的過程中涉及到的API列表:
Tf.keras.estimator.to_estimator,可以幫我們把keras模型給轉成estimator,有Train、evaluate等幾個接口;
Tf.estimator.BaselineClassifier;
Tf.estimator.LinearClassifier;
Tf.estimator.DNNClassifier。
在講Tf.feature_columnAPI的時候,會使用其中的這么幾個接口:
categorical_column_with_vocabulary_list;
numeric_column;
indicator_column;
cross_column。
然后再講一個keras.layers.DenseFeatures的API,它可以把Tf.feature_column這種表達的數據給讀取到網絡中來。
泰坦尼克問題引入分析
第一個實戰,如何將keras模型給轉成estimitor,然后去進行訓練和測試。
feature_collumn使用
keras_to_estimator
預定義estimator使用
交叉特征實戰
TF1.0引入
之上就完成了一個estimator的實戰,在estimator的實戰過程中,講解了如何去使用tf.feature_column,然后去表達數據,如何把我們的keras model轉成estimator,去進行使用,如何去使用與定義好的estimator,然后去對問題進行建模,搭建模型,然后如何在feature_columns上去做特征工程,我們用了一個交叉特征去進行了展示,在keras model給展成estimator的過程中,我們遇到了一個bug,tensorflow框架的bug。
接下來是tensorflow1.0的部分,在這部分首先通過幾個實戰,給大家講解tensorflow1.0中有但是2.0中沒有的知識。
Tf1.0實現全連接網絡,這和2.0中第一次實現的全連接網絡是一樣的,能夠體現1.0中的一些特點,包括placeholder、session、feed_dict。
Dataset使用,講1.0中使用dataset和2.0中有什么區別。
自定義estimator,2.0中推薦使用自定義estimator的方式就是,用keras構建一個模型,然后把它轉成estimator,但是1.0中不是這樣的,它有一套自定義estimator的方法。
總結2.0和1.0的區別。
講解1.0這部分所涉及到的API列表:
Tf1.0實現全連接網絡:
placeholder、tf.layers.dense(實現全連接層)、tf.train.AdamOptimizer(Adam的優化器);
tf.losses.sparse_softmax_cross_entropy(損失函數);
tf.global_variables_initializer(初始化參數)、feed_dict(填充數據)。
Dataset:(這兩個API是用來初始化dataset的,在2.0中已經沒有了)
dataset.make_one_shot_iterator、dataset.make_initializable_iterator。
自定義estimator:
tf.feature_column.input_layer(這個在2.0里邊就是tf.keras_layers.dense_features);
tf.estimator.EstimatorSpec(這個在1.0和2.0中都有的);
tf.metrics.accuracy。
TF1.0計算圖構建
TF1.0模型訓練
TF1_dataset使用
TF1_自定義estimator
API改動升級與課程總結
1.0和2.0區別:
①靜態圖和動態圖(即建好之后是否可以修改):
1.0中session、feed_dict、placeholder都是附着於圖的,先構建好圖,然后再打開一個連接把數據塞進去去進行訓練,而2.0中就不需要這樣了,所以這三個東西都不要了。同樣的1.0中dataset的make_one_shot/initializable_iterator在2.0中被移除了,因為它們也是給靜態圖做服務的。2.0中跟動態圖相關的幾個東西,eager mode、@tf.function、AutoGraph,2.0中不需要先構建好圖,而是所見即所得,可以用像普通python代碼那樣那種方式去實現圖。tf.function、AutoGraph是一種把普通python代碼轉化成tensorflow圖結構的機制,這種機制的好處:性能好(因為tensorflow的圖結構是經過特殊的優化,尤其是在GPU上)、可以導入導出為SavedModel(普通的python中的變量是不能夠保存下來的,有了tf.function之后就可以保存到tensorflow的graph_def中去了,可以導出就可以導入,這種方式可以很方便的幫助我們斷點續傳),例如python中的for/while循環可以變成tensorflow中里邊的while_loop,然后if可以變成tensorflow中的tf.cond,for _ in dataset可以變成tensorflow中的dataset.reduce等等
②API變動:
tensorflow現在有2000個API,500個在根空間下(即tf.跟着的)。一些空間被建立了但是沒有包含所有相關API,如tf.round沒有在tf.math下邊,在2.0中tf.round就被移到了tf.math下。有些API在根空間下但是很少被使用如tf.zeta,對於這類API傾向於把它放到子空間下邊去。有些經常使用,但不在根空間下,如tf.manip下的對tensor做操作的API,這種API需要放到根空間下可以保持代碼簡短。有些空間層次太深,這樣的就減少一個層次。還有些重復API,如許多layers的API,tf.layers的API都放到同一個地方tf.keras.layers下,tf.losses的API放到tf.keras.losses下邊,tf.metrics的放到tf.keras.metrics下,之后構建模型所需要的大部分API,都在tf.keras下邊。有些API有前綴但沒有建立子空間,如tf.string_strip就應該放到tf.string.strip下邊。還有重新組織的API,如tf.debugging、tf.dtypes、tf.io、tf.quantization等。
③如何將1.0代碼升級為2.0的代碼:
替換Session.run,feed_dict、tf.placeholder變成函數調用。
替換API,tf.get_variable替換為tf.Variable,variable_scope(用來幫助區分變量的,在開發tensorflow代碼的時候,可以會使用很多變量,可能會有同樣的名字,如果實在同一個命名空間下定義變量的化那么相同名字就可能沖突,variable_scope就是幫助區分這些變量的,它可以定義一個子空間,然后在這些子空間下定義的變量就不會影響其他空間的變量)被替換為以下東西的一個:tf.keras.layers.Layer、tf.keras.Model、tf.Module,它們三個會自動的定義一個命名空間,從而使得變量命名不會沖突。
升級訓練流程,2.0中使用tf.keras.Model.fit。
升級數據輸入,dataset的使用,1.0中需定義一個iterator,2.0中變成直接輸入。
本集總結
tf.estimator的使用:預定義的estimator、自定義的estimator
使用feature_column組織數據
tf1.0基礎使用
tf1.0和2.0的區別:API變動,1.0代碼如何升級為2.0