學習筆記TF042:TF.Learn、分散式Estimator、深度學習Estimator
TF.Learn,TensorFlow重要模塊,各種類型深度學習及流行機器學習演算法。TensorFlow官方Scikit Flow項目遷移,谷歌員工Illia Polosukhin、唐源發起。Scikit-learn代碼風格,幫助數據科學從業者更好、更快適應接受TensorFlow代碼。囊括許多TensorFlow代碼、設計模式,用戶更快搭建機器學習模型實現應用。避免大量代碼重複,把精力放在搭建更精確模型。與其他contrib模塊無逢結合。
分散式Estimator。Estimator,各種各樣機器學習、深度學習類。可以直接用這些高階類,也可以根據實際應用需求快速創建子類。graph_actions模塊,Estimator在訓練、評估模型複雜分散式邏輯被實現、濃縮,不需要複雜Supervisor、Coordinator分散式訓練具體實現細節、邏輯。
Estimator接受自定義模型,函數答名(入參欄位->返回欄位):(1)(features,targets)->(predictions,loss,train_op)。(2)(features,targets,mode)->(predictions,loss,train_op)。(3)(features,targets,mode,params)->(predictions,loss,train_op)。
自定義模型接受兩個參數:features和targets。features,數據特徵。targets數據特徵每行目標或分類標識。tf.one_hot對targets獨熱編碼(One-hot Encoding)。layers.stack疊加多層layers.fully_connected完全連接深度神經網路,每層分別10?20?10個隱藏節點,不同層轉換、訓練,得到新數據特徵。models.logistic_regression_zero_init加一層,0初始參數值邏輯回歸模型,得到預測值、損失值。contrib.layers.optimize_loss函數優化損失值,根據需要選擇不同優化函數和學習速率。optimize_loss訓練運算元(Training Operator),每次訓練迭代優化模型參數和決定模型發展方向。返回預測值、預測概率,或其中一個。
iris數據分類。Scikit-learn datasets引入數據,cross_validation數據分訓練、評估。my_model放learn.Estimator,Scikit-learn風格fit、predict函數。快速定義自己的模型函數,直接利用Estimator各種功能,直接分散式模型訓練,不用擔心實現細節。
模式(Mode)定義函數,常用模式training、evaluation、prediction,可以在ModeKeys找到。加條件語句實現複雜邏輯。params調節參數,fit函數可以給更多參數。
建立機器學習Estimator。BaseEstimator最抽象最基本實現TensorFlow模型訓練、評估類。fit()模型訓練,partial_fit()線上訓練,evaluate()評估模型,predict()使用模型預測新數據。graph_actions複雜邏輯模型訓練、預測。SuperVisor、Coordinator、QueueRunner,分散式訓練、預測。learn.DataFeeder、learn.DataFrame類自動識別、處理、迭代不同類型數據。estimators.tensor_signature對數據進行兼容性判斷(稀疏張量Sparse Tensor),數據讀入更方便、穩定。BaseEstimator對learn.monitors及模型存儲進行初始化設置。learn.monitors監測模型訓練。
BaseEstimator,_get_train_ops()、_get_eval_ops()、_get_predict_ops()子類實現。
Estimator,_get_train_ops()接受features、targets參數,自定義模型函數返回Operation、損失Tensor Tuple,在每個訓練迭代優化模型參數。非監督學習模型Estimator,忽略targets。
_get_eval_ops(),BaseEstimator子類自定義metrics評估每個模型訓練迭代。contrib.metrics。自定義metrics函數返回一個Tensor對象Python字黃代表評估Operation,每次迭代用到。
自定義模型對新數據預測、計算損失值,ModeKeys EVAL表明函數只在評估用。contrib.metrics模塊,streaming_mean對loss計算平均流,之前計算過平均值加這次迭代損失值再計算平均值。
_get_predict_ops()實現自定義預測。對預測結果進一步處理。預測概率轉換簡單預測結果,概率平滑加工(Smooting)。函數返回Tensor對象Python字典代表預測Operation。Estimator predict()函數,Estimator分散式功能。非監督模型,類似Sckkit-learn transform()函數。
邏輯回歸(LogisticRegressor),Estimator提供絕大部分實現,LogisticRegressor只需提供自己的metrics(AUC、accuracy、precision、recall,處理二分類問題),快速在LogiticRegressor基礎寫子類實現個性化二分類Estimator,不需要關心其他邏輯實現。
TF.Learn 隨機森林模型TensorForestEstimator許多細節實現在contrib.tensor_forest。只利用、暴露高階需要用到成分到TensorForestEstimator。超參數通過contrib.tensor_forest.ForestHParams傳到構造函數params,構造函數params.fill()建造隨機森林TensorFlow圖,tensor_forest.RandomForestGraphs。
實現複雜,需要高效率,細節用C++實現單獨Kernel。_get_predict_ops()函數,tensor_forest內部C++實現data_ops.ParseDataTensorOrDict()函數檢測、轉換讀入數據到可支持數據類型,RandomForestGraphs inference_graph函數得到預測Operation。
_get_train_ops()、_get_eval_ops()函數分別調用RandomForestGraphs.trainning_loss()、RandomForestGraphs.onference_graph()函數,data_ops.ParseDataTensorOrDict、data_ops.ParseLabelTensorOrDict分別檢測、轉換features、targets到兼容數據類型。
調節RunConfig運行時參數。RunConfig,TF.Learn類,調節程序運行時參數。num_cores選擇使用核數量,num_ps_replicas調節參數伺服器數量,gpu_memory_fraction控制使用GPU存儲百分比。
RunConfig master參數,指定訓練模型主伺服器地址,task設置任務ID,每個任務ID控制一個訓練模型參數伺服器replica。
初始化一個RunConfig對象,傳進Estimator。RunConfig參數默認值在本地運行簡單模型,只用一個任務ID,80%GPU存儲參數傳進Estimator。運行時參數會自動運用,不用擔心ConfigProto、GPUOptions細節。快速改變參數實現分散式模型訓練、參數伺服器使用。
Experiment,簡單易用建立模型實驗類,建模所需所有信息,Estimator、訓練數據、評估數據、平估指標、監督器、評估頻率。可以選擇當地運行,可以和RunConfig配合分散式試驗。LearnRunner,方便做實驗。
tf.app.flags定義可以從命令行傳入參數,數據、模型、輸出文件路徑、訓練、評估步數。schedule試驗類型。local_run()當地試驗。run_std_server()標準伺服器試驗。master_grpc_url主要GRPC TensorFlow伺服器。num_parameter_servers參數伺服器數量。
建立Experiment對象函數,FLAGS建立RunConfig,機器學習模型Estimator,建立廣度深度結合分類器(DNNLinearCombinedClassifier)。input_train_fn、input_test_fn,數據來源、提供訓練、評估數據。
create_experiment_fn()函數傳入LearnRunner進行不同類型試驗,當地、伺服器試驗。試驗結果存儲到不同路徑。
深度學習Estimator。TF.Learn包含簡單易用深度神經網路Estimator。分類問題DNNClassifier。_input_fn()建立數據,layers模塊建立特徵列。
特徵列、每層隱藏神經單元數、標識類別數傳入DNNClassifier,迅速建立深度神經網路模型。
fit()、evaluate()方法模型訓練、評估。
每行數據都有權重。DNNClassfier,指定一列為權重列,自動分配到訓練過程。四行數據,每行不同權重。權重列、特徵列放入features。
DNNClassifier表明權重列列名 w,特徵列列名x(x轉換特徵列)。
傳入自定義metrics方程_my_metric_op(),操作predictions、targets進行metrics計算。只考慮二分類問題,tf.slice()剪切predictions第二列作預測值。
tf.slice()傳入輸入矩陣input,剪切開始元素begin,剪切Tensor形狀size,size[i]代表第i個維度想剪切矩陣shape。
根據需求任意在predictions、targets操作實現想要metrics計算,evaluate()傳入metrics函數,TF.Learn根據metrics評估模型。
evaluate()可以提供多個metrics,_my_metric_op自定義,tr.contrib自帶。
optimizer提供自定義函數,定義自己的優化函 ,包含指數遞減學習率。
tf.contrib.framework.get_or_create_global_step()得到目前模型訓練到達全局步數。tf.train.exponential_decay()對學習率指數遞減,避免爆炸梯度。
廣度深度模型,DNNLinearCombinedClassifier。谷歌廣泛用在各種機器學習應用,深度神經網路和邏輯回歸結合,不同特徵通過兩種不同方式結合,更能體現應用意義和更有效推薦結果。類似Kaggle競賽Ensemble。
更多參數,與DNNClassifier、LinearClassifier不同特徵列選擇。
gender、education、relationship、workclass轉換為FeatureColumn。分wide_columns、deep_columns。wide_columns用在LinearClassifier,deep_columns用在DNNClassifier。分別傳入DNNLinearCombinedClassifier建立廣度深度模型。具有線性特徵,也具有深度神經網路特徵。
參考資料:
《TensorFlow實戰》
歡迎付費諮詢(150元每小時),我的微信:qingxingfengzi
推薦閱讀:
※Facenet即triplet network模型訓練,loss不收斂的問題?
※人工神經網路ANN現在發展到什麼的樣的狀態? 有很多人說SVM和adaboost比ANN強,又有人說deep learning的ANN更好.到底如何呢.
※如何看待Jeff Dean&Hinton投到ICLR17的MoE的工作?
※caffe用別人的model和prototxt測試,batch_size如何選擇?
※向量 L1 範數最小化問題?
TAG:TensorFlow | 机器学习 | 深度学习DeepLearning |