訓練第一個深度學習模型

用 Tensorflow+Keras 試試看

以廻歸問題為例, 我們用三個步驟來完成:

  1. 定義帶有未知參數的函數; 用數個 ReLu (或是 Sigmoid) 函數的組合可逼近目標函數. 設定數量的 ReLu越多越能趨近.

  2. 定義預測值與實際值差異的損失函數

  3. 最佳化, Gradient Descent 能幫忙找到足夠好的解.

我們已經將一個深度神經網路給設計出來了:

第二步驟是要定義損失函數, 我們先試試看 MSE, Mean Squared Error.

我們先試試看 Adam 是近幾年常被用的 optimizer, 再利用 compile 將optimizer與損失函數給綁定. 過程中我們想知道模型訓練出來的指標, 假設我們關心 Mean Absolute Error, 那就 'mae'.

為何 loss 與 metrics 需要分別設定呢? 何不直接用真正關心的 metrics 當作 loss? 主要是因為要進行最佳化需要做 gradient descent, 需要可以對loss做微分.

我們已經把資料預處理成一個取名為 trainDF 的 DataFrame, 而對應的總價我們以 trainY 來記錄. 在訓練過程中, 我們需要觀察其進展, 我們想看看模型套在非優化時用到的資料其性能, metrics 如何, 所以我還需要準備 validation 資料. 以下面的代碼為例, 我們讓程式自動幫我們從 trainDF 裡隨機切出 20% 來作為 validation set.

那我們可以開始訓練模型:

假設我們完成訓練模型了, 我們想看看套在真實環境中, 該模型是否真的好? 我們就必須有真實的數據做 Test (也常被稱之為 Inference). 但是系統如果還沒上線, 所有的數據也都是人工先準備好的模擬未來真實數據, 所以有時我們會把所有標示完的數據切割成三份: Training Set-Validation set-Testing set. 只是這個 Testing set 某些角度來講, 其實與 validation 其採樣是一致的, 似乎額外切出來模擬真實環境, 是實質效益的.