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