Keras的回调函数
訓練模型時,很多事情一開始無法預測。尤其是你不知道需要多少輪次才能得到最佳驗證損失。通常簡單的辦法是:訓練足夠多的輪次,這時模型已經開始過擬合了,根據第一次運行來確定訓練所需要的正確輪次,然后使用這個最佳輪數從頭開始啟動一個新的訓練。當然,這種方法很浪費。更好的辦法是使用回調函數。
ModelCheckpoing和EarlyStopping回調函數
如果監控的目標在設定輪數內不再改善,可以用EarlyStopping回調函數來中斷訓練。這個回調函數通常與ModelCheckpoint結合使用,后者可以在訓練過程中持續的不斷保存模型(你也可以選擇只保存目前的最佳模型,即一輪結束后具有最佳性能的模型)
import keras # 通過fit的callbacks參數將回調函數傳入模型中,這個參數接收一個回調函數列表,你可以傳入任意個回調函數 callback_lists = [keras.callbacks.EarlyStopping(monitor = 'acc', # 監控模型的驗證精度patience = 1,), # 如果精度在多于一輪的時間(即兩輪)內不再改善,就中斷訓練# ModelCheckpoint用于在每輪過后保存當前權重keras.callbacks.ModelCheckpoint(filepath = 'my_model.h5', # 目標文件的保存路徑# 這兩個參數的意思是,如果val_loss沒有改善,那么不需要覆蓋模型文件,# 這就可以始終保存在訓練過程中見到的最佳模型monitor = 'val_loss', save_best_only = True,) ]model.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['acc'])# 由于回調函數要監控驗證損失和驗證精度,所以在調用fit時需要傳入validation_data(驗證數據) model.fit(x, y, epochs = 10,batch_size = 32,callbacks = callbacks_list,validation_data = (x_val, y_val))ReduceLROnPlateau回調函數
如果驗證損失不再改善,你可以使用這個回調函數來降低學習率。在訓練過程中如果出現了損失平臺(loss plateau),那么增大或減小學習率都是跳出局部最小值的有效策略。這里可以用到ReduceLROnPlateau回調函數。
callback_list = [keras.callbacks.ReduceLROnPlateau(monitor = 'val_loss', # 監控模型的驗證損失factor = 0.1, # 觸發時將學習率除以10patience = 10) # 如果驗證損失在10輪內都沒有改善,那么就觸發這個回調函數 ]# 由于回調函數要監控驗證損失和驗證精度,所以在調用fit時需要傳入validation_data(驗證數據) model.fit(x, y, epochs = 10,batch_size = 32,callbacks = callbacks_list,validation_data = (x_val, y_val))編寫自己的回調函數
如果你需要在訓練過程中采取特定行動,而這項行動又沒有包含在內置的回調函數中,那么可以編寫自己的回調函數。這種回調函數的實現形式是創建keras.callbacks.Callback類的子類。然后你可以實現下面這些方法,它們分別在訓練過程中的不同時間被調用。
on_epoch_begin # 在每輪開始時被調用 on_epoch_end # 在每輪結束時被調用on_batch_begin # 在處理每個批量之前被調用 on_batch_end # 在處理每個批量之后被調用on_train_begin # 在訓練開始時被調用 on_train_end # 在訓練結束時被調用這些方法被調用時都有一個logs參數,這個參數是一個字典,里面包好前一個批量、前一個輪次或前一次訓練的信息(訓練的指標和驗證指標等)。此外,回調函數還可以訪問下列屬性:
- self.model:調用回調函數的模型實例
- self.validation_data:傳入fit作為驗證數據的值
下面是一個回調函數的簡單示例,它可以在每輪結束后將模型每層激活保存到硬盤(格式為Numpy數組),這個激活是對驗證集的第一個樣本計算得到的。
import keras import numpy as npclass ActivationLogger(keras.callbacks.Callback):def set_model(self, model):self.model = model # 在訓練之前由父模型調用,告訴回調函數是哪個模型在調用它layer_outputs = [layer.output for layer in model.layers]self.activations_model = keras.models.Model(model.input,layer_outputs) # 模型實例,返回每層的激活def on_epoch_end(self, epoch, logs = None):if self.validation_data is None:raise RuntimeError('Requires validation_data')validation_sample = self.validation_data[0][0:1] # 獲取驗證數據的第一個輸入樣本activation = self.activations_model.predict(validation_sample)f = open('activation_at_epoch_' + str(epoch) + '.npz', 'w') # 將數據保存到硬盤np.savez(f, activations)f.close() 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Keras的回调函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keras函数式API
- 下一篇: 数的四则运算