初探深度學習使用 Keras part 2
CSDN - 對 Dropout 的詮釋
- 組合派 (Ensemble)
overfitting → 參數量過多 → 找到一個比較瘦的網路可能可以降低 overfitting 的程度 → 手動或使用 Grid-
Search? 太慢 → 使用 Dropout 使學習時隨機打斷一些連結 → 可以解決費時的問題,把重要的連結權重增
加;不重要的減輕 → 重新組合起來後 (Inference phase) 自然會是一個以權重定義後的瘦網路。
- 動機論 (有豬隊友)
overfitting → 有人 (參數/連結) 濫竽充數 → 隨機將某些人 (神經元) 分成數組 → 各組學會懂得自立自強
→ 重新組合後 (Inference phase) 會比原本更強大。
參考連結:
知乎 - BatchNorm 的原理與實戰
- 背景:
為什麼神經網路這麼不穩定 → 神經網路各層間的映射頻繁的變換 (Internal Covariate Shift)
- Internal Covariate Shift 的問題
- 網路在初期需要透過不斷大幅調整來適應輸入的分布變化
- 深層網路的梯度消失/爆炸問題使分布更加不穩
- 解法
在各層網路中的各特徵軸 (channel) 單獨進行標準化,使其變為分布平均為 0, 變異數為 1 的分布,再加上
平移與縮放,就可以表示原本的分布。
參考連結:
CSDN - Earlystopping 的使用與技巧
為何要使用 EarlyStopping:繼續訓練會導致測試集準確率下降。
- 過度擬合
- 學習率過大導致不收斂
- 使用 Regulizers 時,Loss 減少未必是準確率上升,可能是 weights 變少而已。
EarlyStopping 可以監控的項目
- acc, val_acc, loss, val_loss, ...etc 等 loss 與 metrics
有時候要監控的項目不是越小越好 (“min”),這時候要可以手動將 mode 設成 “max”
參考連結:
莫煩 Python - 儲存與載回模型
- 儲存模型:前面的課程內容已經提過
- 載回模型:
- 儲存整個模型的話
- 載回模型:
-> keras.models.load_model(path_to_your_model)
- 只儲存權重的話
-> model = build_model(...)
-> model.load_weights(path_to_your_weight_file)
參考連結:
Github 原碼:LearningRateScheduler 與 ReduceLR
A. LearningRateScheduler
- 在每個 epoch 開始前,得到目前 lr
- 根據 schedule function 重新計算 lr,比如 epoch = n 時, new_lr = lr * 0.1
- 將 optimizer 的 lr 設定為 new_lr
- 根據 shhedule 函式,假設要自訂的話,它應該吃兩個參數:epoch & lr
B. ReduceLR
- 在每個 epoch 結束時,得到目前監控目標的數值
- 如果目標比目前儲存的還要差的話,wait+1;若否則 wait 設為 0,目前監控數值更新新的數值
- 如果 wait >= patient,new_lr = lr * factor,將 optimizer 的 lr 設定為 new_lr,並且 wait 設回 0
參考連結:
- https://github.com/keras-team/keras/blob/master/keras/callbacks.py#L906
- https://github.com/keras-team/keras/blob/master/keras/callbacks.py#L1287
CSDN - Keras 自定義 Loss 函數
有時候我們想根據任務調整損失函數,Keras 可以在 compile model 時使用自定義函數。
最常用的方式
- 自定義函數必須至少要有兩個參數:y_true, y_pred。其他參數則可視狀況自行加入。
較不常用的方式
- 定義一個 loss_layer
- 在 call function 中用 self.add_loss 加其加入
進階參考資料:
留言
張貼留言
歡迎留言一起討論