TensorFlow模型介紹
模型定義
定義wide and deep模型是比較簡單的,tutorial中提供了比較完整的模型構建實例:
獲取輸入
模型的輸入是一個python的dataframe。如tutorial的實例代碼,可以通過pandas.read_csv從CSV文件中讀入數據構建data frame。
定義feature columns
tf.contrib.layers中提供了一系列的函數定義不同類型的feature columns:
tf.contrib.layers.sparse_column_with_XXX構建低維離散特征
sparse_feature_a = sparse_column_with_hash_bucket(…)
sparse_feature_b = sparse_column_with_hash_bucket(…)
tf.contrib.layers.crossed_column構建離散特征的組合
sparse_feature_a_x_sparse_feature_b = crossed_column([sparse_feature_a, sparse_feature_b], …)
tf.contrib.layers.real_valued_column構建連續(xù)型實數特征
real_feature_a = real_valued_column(…)
tf.contrib.layers.embedding_column構建embedding特征
sparse_feature_a_emb = embedding_column(sparse_id_column=sparse_feature_a, )
定義模型
定義分類模型:
m = tf.contrib.learn.DNNLinearCombinedClassifier( n_classes = n_classes, // 分類數目 weight_column_name = weight_column_name, // 訓練實例的權重 model_dir = model_dir, // 模型目錄 linear_feature_columns = wide_columns, // 輸入線性模型的feature columns linear_optimizer = tf.train.FtrlOptimizer( 。。.), // 線性模型權重更新的optimizer dnn_feature_columns = deep_columns, // 輸入DNN模型的feature columns dnn_hidden_units=[ 100, 50], // DNN模型的隱藏層單元數目 dnn_optimizer=tf.train.AdagradOptimizer( 。。.) // DNN模型權重更新的optimizer )
需要指出的是:模型的model_dir同下面會提到的export模型的目錄是2個不同的目錄,model_dir存放模型的graph和summary數據,如果model_dir存放了上一次訓練的模型數據,訓練時會從model_dir恢復上一次訓練的模型并在此基礎上進行訓練。我們用tensorboard加載顯示的模型數據也是從該目錄下生成的。模型export的目錄則主要是用于tensorflow server啟動時加載模型的servable實例,用于線上預測服務。
如果要使用回歸模型,可以如下定義:
m = tf.contrib.learn.DNNLinearCombinedRegressor( weight_column_name = weight_column_name, linear_feature_columns = wide_columns, linear_optimizer = tf.train.FtrlOptimizer( 。。.), dnn_feature_columns = deep_columns, dnn_hidden_units=[ 100,50], dnn_optimizer=tf.train.AdagradOptimizer( 。。.) ) 訓練評測
訓練模型可以使用fit函數:m.fit(input_fn=input_fn(df_train)),評測使用evaluate函數:m.evaluate(input_fn=input_fn(df_test))。Input_fn函數定義如何從輸入的dataframe構建特征和標記:
def input_fn(df) // tf.constant構建constant tensor,df[k].values是對應feature column的值構成的listcontinuous_cols = {k: tf.constant(df[k].values) fork inCONTINUOUS_COLUMNS} // tf.SparseTensor構建sparse tensor,SparseTensor由indices,values, dense_shape三// 個dense tensor構成,indices中記錄非零元素在sparse tensor的位置,values是// indices中每個位置的元素的值,dense_shape指定sparse tensor中每個維度的大小// 以下代碼為每個category column構建一個[df[k].size,1]的二維的SparseTensor。categorical_cols = { k: tf.SparseTensor( indices=[[i, 0] fori inrange(df[k]。 size)], values=df[k].values, dense_shape=[df[k]。 size, 1]) fork inCATEGORICAL_COLUMNS } // 可以用以下示意圖來表示以上代碼構建的sparse tensor// label是一個 constanttensor,記錄每個實例的labellabel= tf. constant(df[LABEL_COLUMN].values) // features是continuous_cols和categorical_cols的union構成的dict // dict中每個entry的key是feature column的name,value是feature column值的tensor returnfeatures, label輸出
模型通過export輸出到一個指定目錄,tensorflow serving從該目錄加載模型提供在線預測服務:m.export(export_dir=export_dir,input_fn = export._default_input_fn
use_deprecated_input_fn=True,signature_fn=signature_fn)
input_fn函數定義生成模型servable實例的特征,signature_fn函數定義模型輸入輸出的signature。
由于在tensorflow1.0之后export已經deprecate,需要用export_savedmodel來替代,所以本文就不對export進行更多講解,只在文末給出我們是如何使用它的,建議所有使用者以后切換到最新的API。
模型詳解
wide and deep模型是基于TF.learn API來實現的,其源代碼實現主要在tensorflow.contrib.learn.python.learn.estimators中。以分類模型為例,wide與deep結合的分類模型對應的類是DNNLinearCombinedClassifier,實現在源文件dnn_linear_combined.py。 我們先看看DNNLinearCombinedClassifier的初始化函數的完整定義,看構造一個wide and deep模型可以輸入哪些參數:
def __init__( self, model_dir =None, n_classes =2, weight_column_name =None, linear_feature_columns =None, linear_optimizer =None, joint_linear_weights =False, dnn_feature_columns =None, dnn_optimizer =None, dnn_hidden_units =None, dnn_activation_fn =nn .relu, dnn_dropout =None, gradient_clip_norm =None, enable_centered_bias =False, config =None, feature_engineering_fn =None, embedding_lr_multipliers =None):
我們可以將類的構造函數中的參數分為以下幾組
基礎參數
model_dir
我們訓練的模型存放到model_dir指定的目錄中。如果我們需要用tensorboard來DEBUG模型,將tensorboard的logdir指向該目錄即可:tensorboard –logdir=$model_dir
n_classes
分類數。默認是二分類,》2則進行多分類。
weight_column_name
定義每個訓練樣本的權重。訓練時每個訓練樣本的訓練誤差乘以該樣本的權重然后用于權重更新梯度的計算。如果需要為每個樣本指定權重,input_fn返回的features里需要包含一個以weight_column_name為列名的列,該列的長度為訓練樣本的數目,列中每個元素對應一個樣本的權重,數據類型是float,如以下偽代碼:
weight = tf .constant(df[WEIGHT_COLUMN_NAME] .values, dtype=float32);features[weight_column_name] = weight
config
指定運行時配置參數
eature_engineering_fn
對輸入函數input_fn輸出的(features, label)進行后處理生成新的(features’, label’)然后輸入給模型訓練函數model_fn使用。
call_model_fn(): feature, labels = self._feature_engineering_fn(feature, labels) 線性模型相關參數
linear_feature_columns
線性模型的輸入特征
linear_optimizer
線性模型的優(yōu)化函數,定義權重的梯度更新算法,默認采用FTRL。所有默認支持的linear_optimizer和dnn_optimizer可以在optimizer.py的OPTIMIZER_CLS_NAMES變量中找到相關定義。
join_linear_weights
按照代碼中的注釋,如果join_linear_weights= true, 線性模型的權重會存放在一個tf.Variable中,可以加快訓練,但是linear_feature_columns中的特征列必須都是sparse feature column并且每個feature column的combiner必須是“sum”。經過自己線下的對比試驗,對模型的預測能力似乎沒有太大影響,對訓練速度有所提升,最終訓練模型時我們保持了默認值。
DNN模型相關參數
dnn_feature_columns
DNN模型的輸入特征
dnn_optimizer
DNN模型的優(yōu)化函數,定義各層權重的梯度更新算法,默認采用Adagrad。
dnn_hidden_units
每個隱藏層的神經元數目
dnn_activation_fn
隱藏層的激活函數,默認采用RELU
dnn_dropout
模型訓練中隱藏層單元的drop_out比例
gradient_clip_norm
定義gradient clipping,對梯度的變化范圍做出限制,防止gradient vanishing 或gradient explosion。wide and deep中默認采用tf.clip_by_global_norm。
embedding_lr_multipliers
embedding_feature_column到float的一個mapping。對指定的embedding feature column在計算梯度時乘以一個常數因子,調整梯度的變化速率。
看完模型的構造函數后,我們大概知道wide和deep端的模型各對應什么樣的模型,模型需要輸入什么樣的參數。為了更深入了解模型,以下我們對wide and deep模型的相關代碼進行了分析,力求解決如下疑問: (1) 分別用于線性模型和DNN模型訓練的特征是如何定義的,其內部如何實現;(2) 訓練中線性模型和DNN模型如何進行聯合訓練,訓練誤差如何反饋給wide模型和deep模型?下面我們重點針對特征和模型訓練這兩方面進行解讀。
特征
wide and deep模型訓練一般是以多個訓練樣本作為1個批次(batch)進行訓練,訓練樣本在行維度上定義,每一行對應一個訓練樣本實例,包括特征(feature column),標注(label)以及權重(weight),如圖2。特征在列維度上定義,每個特征對應1個feature column,feature column由在列維度上的1個或者若干個張量(tensor)組成,tensor中的每個元素對應一個樣本在該feature column上某個維度的值。feature column的定義在可以在源代碼的feature_column.py文件中找到,對應類為_FeatureColumn,該類定義了基本接口,是wide and deep模型中所有特征類的抽象父類。
wide and deep模型中使用的特征包括兩大類: 一類是連續(xù)型特征,主要用于deep模型的訓練,包括real value類型的特征以及embedding類型的特征等;一類是離散型特征,主要用于wide模型的訓練,包括sparse類型的特征以及cross類型的特征等。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
TensorFlow模型介紹下載
相關電子資料下載
- 【風火輪YY3568開發(fā)板免費體驗】第六章:在Solus上運行自定義模型并遷移到YY3 411
- 深度學習框架tensorflow介紹 480
- 深度學習框架pytorch介紹 454
- 【米爾MYC-JX8MPQ評測】+ 運行 TensorFlow Lite(CPU和NPU對比) 524
- 手把手帶你玩轉—i.MX8MP開發(fā)板移植官方NPU TensorFlow例程 444
- 在樹莓派64位上安裝TensorFlow 505
- TensorFlow Lite for MCUs - 網絡邊緣的人工智能 339
- 2023年使用樹莓派和替代品進行深度學習 1506
- 用TensorFlow2.0框架實現BP網絡 1849
- 那些年在pytorch上踩過的坑 571