數據流圖的高層、通用訓練閉環
我們創建了一個訓練閉環,它具有如下功能。
·首先對模型參數進行初始化。通常採用對參數隨機賦值的方法,但對於比較簡單的模型,也可以將各參數的初值均設爲0。
·讀取訓練數據(包括每個數據樣本及其期望輸出)。通常人們會在這些數據送入模型之前,隨機打亂樣本的次序。
·在訓練數據上執行推斷模型。這樣,在當前模型參數配置下,每個訓練樣本都會得到一個輸出值。
·計算損失。損失是一個能夠刻畫模型在最後一步得到的輸出與來自訓練集的期望輸出之間差距的概括性指標。
·調整模型參數。這一步對應於實際的學習過程。給定損失函數,學習的目的在於通過大量訓練步驟改善各參數的值,從而將損失最小化。最常見的策略是使用梯度下降算法
上述閉環會依據所需的學習速率、所給定的模型及其輸入數據,通過大量循環不斷重複上述過程。
當訓練結束後,便進入評估階段。在這一階段中,我們需要對一個同樣含有期望輸出信息的不同測試集依據模型進行推斷,並評估模型在該數據集上的損失。該測試集中包含了何種樣本,模型是預先無法獲悉的。通過評估,可以瞭解到所訓練的模型在訓練集之外的推廣能力。一種常見的方法是將原始數據集一分爲二,將70%的樣本用於訓練,其餘30%的樣本用於評估。
下面利用上述結構爲模型訓練和評估定義一個通用的代碼框架:
import tensorflow as tf # 初始化變量和模型參數,定義訓練閉環中的運算 def inference(X): # 計算推斷模型在數據X上的輸出,並將結果保存 pass def loss(X, Y): # 依據訓練數據X和期望輸出Y計算損失 pass def inputs(): # 讀取或生成訓練數據X及其期望輸出Y pass def train(total_loss): # 依據計算的總損失訓練或調整模型參數 pass def evaluate(sess, X, Y): # 對訓練得到的模型進行評估 pass # 在一個會話對象中啓動數據流圖,搭建流程 with tf.Session() as sess: tf.initialize_all_variables().run() X, Y = inputs() total_loss = loss(X, Y) train_op = train(total_loss) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) # 實際的訓練迭代次數 training_steps = 1000 for step in range(training_steps): sess.run([train_op]) # 處於調試和學習的目的,查看損失在訓練過程中的遞減情況 if step % 10 == 0: print("loss:", sess.run([total_loss])) evaluate(sess, X, Y) coord.request_stop() coord.join(threads) sess.close()以上便是模型訓練和評估的基本代碼框架。首先需要對模型參數進行初始化;然後爲每個訓練閉環中的運算定義一個方法:讀取訓練數據(inputs方法),計算推斷模型(inference方法),計算相對期望輸出的損失(loss方法),調整模型參數(train方法),評估訓練得到的模型(evaluate方法);之後,啓動一個會話對象,並運行訓練閉環。