本章總覽
模型驗證:model.evaluate()這個函數封裝的比較low,建議大家自己寫,雖然我現在先不會,但是思路是這樣的。
模型預測:model.predict()雖然也是封裝好的,但是我們一樣可以自己寫。
回調函數
回調函數就是keras在模型訓練時,需要調用多個函數。調用會根據這些函數進行保存,或者學習力的衰減。
ModelCheckpoint:定期保存模型,第二個epoch沒有第一個好,就不保存第二個epoch,直接在第一個基礎上進行第三個epoch。
EarlyStopping:當培訓不再改善驗證指標時,停止培訓。
Tensorboard:后期介紹
CSVLogger:將結果(損失和指標)寫在csv數字上面。
keras版本模型訓練,這里用全連接層的函數模型
1.1構建模型(單輸入單輸出的模型)
提供許多內置的優化器,損失和指標 通常,不必從頭開始創建自己的損失,指標或優化函數,因為所需的可能已經是Keras API的一部分:
優化器:
SGD() (有或沒有動量)
RMSprop()
Adam()
損失:
MeanSquaredError()
KLDivergence()
CosineSimilarity()
指標:
AUC()
Precision()
Recall()
另外,如果想用上述的默認設置,那么在很多情況下,可以通過字符串標識符指定優化器,損失和指標:
1.2進行模型訓練
通過將數據切成大小為”batch_size“的”批“來訓練模型,並針對給定數量的epoch重復遍歷整個數據集。
自動划分驗證集
在前面的例子中,我們使用validation_data參數將Numpy數組的元組傳遞(x_val, y_val)給模型,以在每個時期結束時評估驗證損失和驗證指標。
還有一個選擇:參數validation_split允許您自動保留部分訓練數據以供驗證。參數值代表要保留用於驗證的數據的一部分,因此應將其設置為大於0且小於1的數字。例如,validation_split=0.2表示“使用20%的數據進行驗證”,而validation_split=0.6表示“使用60%的數據用於驗證”。
驗證的計算方法是在進行任何改組之前,對fit調用接收到的數組進行最后x%的采樣。
注意,只能validation_split在使用Numpy數據進行訓練時使用。
1.3模型測試
使用測試函數model.evaluate()進行驗證,返回test loss和metrics。
model.predict 用來預測。
一定要重視官方文檔,學習如何使用函數。
案例一講述的函數使用的過程
案例2、使用樣本加權和類別加權
除了輸入數據和目標數據外,還可以在使用時將樣本權重或類權重傳遞給模型fit:
從Numpy數據進行訓練時:通過sample_weight和class_weight參數。 從數據集訓練時:通過使數據集返回一個元組(input_batch, target_batch, sample_weight_batch)。 “樣本權重”數組是一個數字數組,用於指定批次中每個樣本在計算總損失時應具有的權重。它通常用於不平衡的分類問題中(這種想法是為很少見的班級賦予更多的權重)。當所使用的權重為1和0時,該數組可用作損失函數的掩碼(完全丟棄某些樣本對總損失的貢獻)。
“類別權重”字典是同一概念的一個更具體的實例:它將類別索引映射到應該用於屬於該類別的樣本的樣本權重。例如,如果在數據中類“ 0”的表示量比類“ 1”的表示量少兩倍,則可以使用class_weight={0: 1., 1: 0.5}。
這是一個Numpy示例,其中我們使用類權重或樣本權重來更加重視第5類的正確分類。
構建模型
模型訓練
樣本加權
類別加權和樣本加權在實際訓練中是非常重要的一部分內容。
使用回調函數
Keras中的回調是在訓練期間(在某個時期開始時,在批處理結束時,在某個時期結束時等)在不同時間點調用的對象,這些對象可用於實現以下行為:
在訓練過程中的不同時間點進行驗證(除了內置的按時間段驗證)
定期或在超過特定精度閾值時對模型進行檢查
當訓練似乎停滯不前時,更改模型的學習率
當訓練似乎停滯不前時,對頂層進行微調
在訓練結束或超出特定性能閾值時發送電子郵件或即時消息通知 等等。 回調可以作為列表傳遞給model.fit:
早停函數EarlyStopping
monitor: 被監測的數據。
min_delta: 在被監測的數據中被認為是提升的最小變化, 例如,小於 min_delta 的絕對變化會被認為沒有提升。
patience: 沒有進步的訓練輪數,在這之后訓練就會被停止。
verbose: 詳細信息模式。
mode: {auto, min, max} 其中之一。 在 min 模式中, 當被監測的數據停止下降,訓練就會停止;在 max 模式中,當被監測的數據停止上升,訓練就會停止;在 auto 模式中,方向會自動從被監測的數據的名字中判斷出來。
許多內置的回調可用
ModelCheckpoint:定期保存模型。
EarlyStopping:當培訓不再改善驗證指標時,停止培訓。
TensorBoard:定期編寫可在TensorBoard中可視化的模型日志(更多詳細信息,請參見“可視化”部分)。
CSVLogger:將損失和指標數據流式傳輸到CSV文件。 等等
checkpoint模型
在相對較大的數據集上訓練模型時,至關重要的是要定期保存模型的checkpoint。
最簡單的方法是使用ModelCheckpoint回調:
一定要學會使用help()這個函數,他比直接去tensorflow官網查函數還好使。
使用回調實現動態學習率調整(非常重要)
由於優化程序無法訪問驗證指標,因此無法使用這些計划對象來實現動態學習率計划(例如,當驗證損失不再改善時降低學習率)。
但是,回調確實可以訪問所有指標,包括驗證指標!因此,可以通過使用回調來修改優化程序上的當前學習率,從而實現此模式。實際上,它是作為ReduceLROnPlateau回調內置的。
ReduceLROnPlateau參數
monitor: 被監測的指標。
factor: 學習速率被降低的因數。新的學習速率 = 學習速率 * 因數
patience: 沒有進步的訓練輪數,在這之后訓練速率會被降低。
verbose: 整數。0:安靜,1:更新信息。
mode: {auto, min, max} 其中之一。如果是 min 模式,學習速率會被降低如果被監測的數據已經停止下降; 在 max 模式,學習塑料會被降低如果被監測的數據已經停止上升; 在 auto 模式,方向會被從被監測的數據中自動推斷出來。
min_delta: 衡量新的最佳閾值,僅關注重大變化。
cooldown: 在學習速率被降低之后,重新恢復正常操作之前等待的訓練輪數量。
min_lr: 學習速率的下邊界。
4.0案例四,將數據傳遞到多輸入多輸出模型
第一個模型給出了單輸入輸出的案例,是一個具有單個輸入(shape的張量(32,))和單個輸出(shape的預測張量(10,))的模型。
以下模型具有形狀的圖像輸入(32, 32, 3)(即(height, width, channels))和形狀的時間序列輸入(None, 10)(即(timesteps, features))。我們的模型將具有根據這些輸入的組合計算出的兩個輸出:“得分”(形狀(1,))和五類(形狀(5,))的概率分布。
可以繪制這個模型,以便可以清楚地看到我們在這里做什么(請注意,圖中顯示的形狀是批處理形狀,而不是按樣本的形狀)
4.1損失函數
在編譯時,通過將損失函數作為列表傳遞,我們可以為不同的輸出指定不同的損失。
如果我們僅將單個損失函數傳遞給模型,則將相同的損失函數應用於每個輸出,這在此處不合適。
4.2指標函數
由於我們為輸出層命名,因為我們還可以通過dict指定每個輸出的損失和指標:
如果有兩個以上的輸出,建議使用顯式名稱和字典。
可以使用以下參數對不同的特定於輸出的損失賦予不同的權重(例如,在我們的示例中,我們可能希望通過將某類損失函數賦予更高的權重)loss_weight:
還可以選擇不為某些輸出計算損失,如果這些輸出僅用於預測而不是訓練:
4.3完整運行
————————————————
版權聲明:本文為CSDN博主「batmanchen」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/batmanchen/article/details/106503627