我們開始說明 for loop的部分。
在訓練模型時,我們需要大量的data,這些data來自於train_loader。但是,我們並非一次全部倒入所有資料,進行訓練,而是每次一批資料倒入訓練。每一批的筆數,在train_loader的batch_size參數中設定。每次一批的好處,在於部分資料訓練後,可立即進行最佳化的調整,以及測試驗證(validation)模型的準確性。
進入主題,看程式for loop部分:
for epoch in range(1, args['epochs'] + 1):
通常,我們若寫 range(10), 表示[0..9]。但我們的初始值為1,所以尾端的最大值得加1。整個迴圈數就會有1至epoch那麼多次loop。
接下來,進入train() function:
train(args, model, device, train_loader, optimizer, epoch)
我們需要給它的資訊有--參數、模型、device(模型及資料都放在此處,才能執行)、訓練用資料、優化器以及迴圈數epoch。
此次epoch中,訓練及優化調整後,交由 test(…)測試驗證(validation)模型的準確性:
test_acc = test(args, model, device, test_loader)
同樣的,我們需餵入參數,model(內含優化過的weights),device以及驗證資料test_loader。
Test()所產生的結果(accuracy),交給 test_acc做後續的處理。
接著,test_acc送入NNI,讓NNI可進行後續的比較、優化超參,或是中途停止不必要的計算。
nni.report_intermediate_result(test_acc)
所有的epochs跑完後,將最後的結果也給NNI做後續的處理--比較、優化超參,或是中途停止不必要的計算。
nni.report_final_result(test_acc)
Def main() 到此結束。
接下來我們將說明 train(),test()的細部。不耐煩的讀者,可跳過此2大部分。