您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

TensorFlow模型介紹

大?。?/span>0.6 MB 人氣: 2017-09-28 需要積分:2

  模型定義

  定義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模型中所有特征類的抽象父類。

  TensorFlow模型介紹

  wide and deep模型中使用的特征包括兩大類: 一類是連續(xù)型特征,主要用于deep模型的訓(xùn)練,包括real value類型的特征以及embedding類型的特征等;一類是離散型特征,主要用于wide模型的訓(xùn)練,包括sparse類型的特征以及cross類型的特征等。

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價(jià):好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?