本文整理了絕大多數keras裏的Callback回調)函數,並且收集了代碼調用示例。
大多數內容整理自網絡,參考資料已在文章最後給出。
回調函數Callbacks
回調函數是一組在訓練的特定階段被調用的函數集,你可以使用回調函數來觀察訓練過程中網絡內部的狀態和統計信息。通過傳遞迴調函數列表到模型的.fit()
中,即可在給定的訓練階段調用該函數集中的函數。
【Tips】雖然我們稱之爲回調“函數”,但事實上Keras的回調函數是一個類,回調函數只是習慣性稱呼
Callback
keras.callbacks.Callback()
這是回調函數的抽象類,定義新的回調函數必須繼承自該類
類屬性
-
params:字典,訓練參數集(如信息顯示方法verbosity,batch大小,epoch數)
-
model:
keras.models.Model
對象,爲正在訓練的模型的引用
回調函數以字典logs
爲參數,該字典包含了一系列與當前batch或epoch相關的信息。
目前,模型的.fit()
中有下列參數會被記錄到logs
中:
-
在每個epoch的結尾處(on_epoch_end),
logs
將包含訓練的正確率和誤差,acc
和loss
,如果指定了驗證集,還會包含驗證集正確率和誤差val_acc)
和val_loss
,val_acc
還額外需要在.compile
中啓用metrics=['accuracy']
。 -
在每個batch的開始處(on_batch_begin):
logs
包含size
,即當前batch的樣本數 -
在每個batch的結尾處(on_batch_end):
logs
包含loss
,若啓用accuracy
則還包含acc
BaseLogger
keras.callbacks.BaseLogger()
該回調函數用來對每個epoch累加metrics
指定的監視指標的epoch平均值
該回調函數在每個Keras模型中都會被自動調用
ProgbarLogger
keras.callbacks.ProgbarLogger()
該回調函數用來將metrics
指定的監視指標輸出到標準輸出上
History
keras.callbacks.History()
該回調函數在Keras模型上會被自動調用,History
對象即爲fit
方法的返回值
ModelCheckpoint【重點】
Checkpoint神經網絡模型簡介
應用程序Checkpoint是爲長時間運行進程準備的容錯技術。
這是一種在系統故障的情況下拍攝系統狀態快照的方法。一旦出現問題不會讓進度全部丟失。Checkpoint可以直接使用,也可以作爲從它停止的地方重新運行的起點。
訓練深度學習模型時,Checkpoint是模型的權重。他們可以用來作預測,或作持續訓練的基礎。
Keras庫通過回調API提供Checkpoint功能。
ModelCheckpoint回調類允許你定義檢查模型權重的位置在何處,文件應如何命名,以及在什麼情況下創建模型的Checkpoint。
API允許你指定要監視的指標,例如訓練或驗證數據集的丟失或準確性。你可以指定是否尋求最大化或最小化分數的改進。最後,用於存儲權重的文件名可以包括諸如訓練次數的編號或標準的變量。
當模型上調用fit()函數時,可以將ModelCheckpoint傳遞給訓練過程。
注意,你可能需要安裝h5py庫以HDF5格式輸出網絡權重。
用法示例:
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
該回調函數將在每個epoch後保存模型到filepath
filepath
可以是格式化的字符串,裏面的佔位符將會被epoch
值和傳入on_epoch_end
的logs
關鍵字所填入
例如,filepath
若爲weights.{epoch:02d-{val_loss:.2f}}.hdf5
,則會生成對應epoch和驗證集loss的多個文件。
參數
-
filename:字符串,保存模型的路徑
-
monitor:需要監視的值
-
verbose:信息展示模式,0或1
-
save_best_only:當設置爲
True
時,將只保存在驗證集上性能最好的模型 -
mode:‘auto’,‘min’,‘max’之一,在
save_best_only=True
時決定性能最佳模型的評判準則,例如,當監測值爲val_acc
時,模式應爲max
,當檢測值爲val_loss
時,模式應爲min
。在auto
模式下,評價準則由被監測值的名字自動推斷。 -
save_weights_only:若設置爲True,則只保存模型權重,否則將保存整個模型(包括模型結構,配置信息等)
-
period:CheckPoint之間的間隔的epoch數
例子No.0:官網示例
-
from keras.callbacks import ModelCheckpoint
-
model = Sequential()
-
model.add(Dense(10, input_dim=784, kernel_initializer='uniform'))
-
model.add(Activation('softmax'))
-
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
-
'''
-
saves the model weights after each epoch if the validation loss decreased
-
'''
-
checkpointer = ModelCheckpoint(filepath="/tmp/weights.hdf5", verbose=1, save_best_only=True)
-
model.fit(X_train, Y_train, batch_size=128, epochs=20, verbose=0, validation_data=(X_test, Y_test), callbacks=[checkpointer])
例子No.1:保存改進的每一個改進的CheckPoint模型
應用Checkpoint時,應在每次訓練中觀察到改進時輸出模型權重。
下面的示例創建一個小型神經網絡Pima印第安人發生糖尿病的二元分類問題。你可以在UCI機器學習庫下載這個數據集。本示例使用33%的數據進行驗證。
Checkpoint設置成當驗證數據集的分類精度提高時保存網絡權重(monitor=’val_acc’ and mode=’max’)。權重存儲在一個包含評價的文件中(weights-improvement – { val_acc = .2f } .hdf5)。
-
# Checkpoint the weights when validation accuracy improves
-
from keras.modelsimport Sequential
-
from keras.layersimport Dense
-
from keras.callbacksimport ModelCheckpoint
-
import matplotlib.pyplot as plt
-
import numpy
-
# fix random seed for reproducibility
-
seed= 7
-
numpy.random.seed(seed)
-
# load pima indians dataset
-
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
-
# split into input (X) and output (Y) variables
-
X= dataset[:,0:8]
-
Y= dataset[:,8]
-
# create model
-
model= Sequential()
-
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
-
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
-
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
-
# Compile model
-
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
-
# checkpoint
-
filepath="weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5"
-
checkpoint= ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
-
callbacks_list= [checkpoint]
-
# Fit the model
-
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)
你將在工作目錄中看到包含多個HDF5格式的網絡權重文件。例如:
-
...
-
weights-improvement-53-0.76.hdf5
-
weights-improvement-71-0.76.hdf5
-
weights-improvement-77-0.78.hdf5
-
weights-improvement-99-0.78.hdf5
這是一個非常簡單的Checkpoint策略。如果驗證精度在訓練週期上下波動 ,則可能會創建大量不必要的Checkpoint文件。然而,它將確保你具有在運行期間發現的最佳模型的快照。
例子No.2:保存最佳的Checkpoint模型
如果驗證精度提高的話,一個更簡單的Checkpoint策略是將模型權重保存到相同的文件中。
這可以使用上述相同的代碼輕鬆完成,並將輸出文件名更改爲固定(不包括評價或次數的信息)。
在這種情況下,只有當驗證數據集上的模型的分類精度提高到到目前爲止最好的時候,纔會將模型權重寫入文件“weights.best.hdf5”。
-
# Checkpoint the weights for best model on validation accuracy
-
from keras.modelsimport Sequential
-
from keras.layersimport Dense
-
from keras.callbacksimport ModelCheckpoint
-
import matplotlib.pyplot as plt
-
import numpy
-
# fix random seed for reproducibility
-
seed= 7
-
numpy.random.seed(seed)
-
# load pima indians dataset
-
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
-
# split into input (X) and output (Y) variables
-
X= dataset[:,0:8]
-
Y= dataset[:,8]
-
# create model
-
model= Sequential()
-
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
-
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
-
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
-
# Compile model
-
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
-
# checkpoint
-
filepath="weights.best.hdf5"
-
checkpoint= ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
-
callbacks_list= [checkpoint]
-
# Fit the model
-
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)
你應該在本地目錄中看到權重文件:
weights.best.hdf5
這是一個在你的實驗中需要經常用到的方便的Checkpoint策略。它將確保你的最佳模型被保存,以便稍後使用。它避免了輸入代碼來手動跟蹤,並在訓練時序列化最佳模型。
例子No.3:加載之前保存過的Checkpoint模型
Checkpoint只包括模型權重。它假定你瞭解網絡結構。這也可以序列化成JSON或YAML格式。
在下面的示例中,模型結構是已知的,並且最好的權重從先前的實驗中加載,然後存儲在weights.best.hdf5文件的工作目錄中。
那麼將該模型用於對整個數據集進行預測。
-
# How to load and use weights from a checkpoint
-
from keras.modelsimport Sequential
-
from keras.layersimport Dense
-
from keras.callbacksimport ModelCheckpoint
-
import matplotlib.pyplot as plt
-
import numpy
-
# fix random seed for reproducibility
-
seed= 7
-
numpy.random.seed(seed)
-
# create model
-
model= Sequential()
-
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
-
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
-
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
-
# load weights
-
model.load_weights("weights.best.hdf5")
-
# Compile model (required to make predictions)
-
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
-
print("Created model and loaded weights from file")
-
# load pima indians dataset
-
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
-
# split into input (X) and output (Y) variables
-
X= dataset[:,0:8]
-
Y= dataset[:,8]
-
# estimate accuracy on whole dataset using loaded weights
-
scores= model.evaluate(X, Y, verbose=0)
-
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
-
運行示例生成以下輸出:
-
Created modeland loaded weightsfrom file
-
acc:77.73%
EarlyStopping
keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')
當監測值不再改善時,該回調函數將中止訓練
參數
-
monitor:需要監視的量
-
patience:當early stop被激活(如發現loss相比上一個epoch訓練沒有下降),則經過
patience
個epoch後停止訓練。 -
verbose:信息展示模式
-
mode:‘auto’,‘min’,‘max’之一,在
min
模式下,如果檢測值停止下降則中止訓練。在max
模式下,當檢測值不再上升則停止訓練。
LearningRateScheduler
keras.callbacks.LearningRateScheduler(schedule)
該回調函數是學習率調度器
參數
- schedule:函數,該函數以epoch號爲參數(從0算起的整數),返回一l新學習率(浮點數)
例子:LearningRateScheduler調整學習率
-
from keras.callbacks import LearningRateScheduler
-
def scheduler(epoch):
-
if epoch % 100 == 0 and epoch != 0:
-
lr = K.get_value(model.optimizer.lr)
-
K.set_value(model.optimizer.lr, lr * 0.1)
-
print("lr changed to {}".format(lr * 0.1))
-
return K.get_value(model.optimizer.lr)
-
reduce_lr = LearningRateScheduler(scheduler)
-
model.fit(train_x, train_y, batch_size=32, epochs=5, callbacks=[reduce_lr])
ReduceLROnPlateau
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)
當評價指標不在提升時,減少學習率
當學習停滯時,減少2倍或10倍的學習率常常能獲得較好的效果。該回調函數檢測指標的情況,如果在patience
個epoch中看不到模型性能提升,則減少學習率
參數
- monitor:被監測的量
- factor:每次減少學習率的因子,學習率將以
lr = lr*factor
的形式被減少 - patience:當patience個epoch過去而模型性能不提升時,學習率減少的動作會被觸發
- mode:‘auto’,‘min’,‘max’之一,在
min
模式下,如果檢測值觸發學習率減少。在max
模式下,當檢測值不再上升則觸發學習率減少。 - epsilon:閾值,用來確定是否進入檢測值的“平原區”
- cooldown:學習率減少後,會經過cooldown個epoch才重新進行正常操作
- min_lr:學習率的下限
例子:ReduceLROnPlateau自動減少學習率
-
from keras.callbacks import ReduceLROnPlateau
-
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,patience=5, min_lr=0.001)
-
model.fit(X_train, Y_train, callbacks=[reduce_lr])
CSVLogger
keras.callbacks.CSVLogger(filename, separator=',', append=False)
將epoch的訓練結果保存在csv文件中,支持所有可被轉換爲string的值,包括1D的可迭代數值如np.ndarray.
參數
- fiename:保存的csv文件名,如
run/log.csv
- separator:字符串,csv分隔符
- append:默認爲False,爲True時csv文件如果存在則繼續寫入,爲False時總是覆蓋csv文件
例子:CSVLoggerb保存訓練結果
-
csv_logger = CSVLogger('training.log')
-
model.fit(X_train, Y_train, callbacks=[csv_logger])
LambdaCallback
keras.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None, on_batch_begin=None, on_batch_end=None, on_train_begin=None, on_train_end=None)
用於創建簡單的callback的callback類
該callback的匿名函數將會在適當的時候調用,注意,該回調函數假定了一些位置參數on_eopoch_begin
和on_epoch_end
假定輸入的參數是epoch, logs
. on_batch_begin
和on_batch_end
假定輸入的參數是batch, logs
,on_train_begin
和on_train_end
假定輸入的參數是logs
參數
- on_epoch_begin: 在每個epoch開始時調用
- on_epoch_end: 在每個epoch結束時調用
- on_batch_begin: 在每個batch開始時調用
- on_batch_end: 在每個batch結束時調用
- on_train_begin: 在訓練開始時調用
- on_train_end: 在訓練結束時調用
例子:輕量級自定義回調函數LambdaCallback
-
# Print the batch number at the beginning of every batch.
-
batch_print_callback = LambdaCallback(
-
on_batch_begin=lambda batch,logs: print(batch))
-
# Plot the loss after every epoch.
-
import numpy as np
-
import matplotlib.pyplot as plt
-
plot_loss_callback = LambdaCallback(
-
on_epoch_end=lambda epoch, logs: plt.plot(np.arange(epoch),
-
logs['loss']))
-
# Terminate some processes after having finished model training.
-
processes = ...
-
cleanup_callback = LambdaCallback(
-
on_train_end=lambda logs: [
-
p.terminate() for p in processes if p.is_alive()])
-
model.fit(...,
-
callbacks=[batch_print_callback,
-
plot_loss_callback,
-
cleanup_callback])
編寫自己的回調函數
我們可以通過繼承keras.callbacks.Callback
編寫自己的回調函數,回調函數通過類成員self.model
訪問訪問,該成員是模型的一個引用。
這裏是一個簡單的保存每個batch的loss的回調函數:
-
class LossHistory(keras.callbacks.Callback):
-
def on_train_begin(self, logs={}):
-
self.losses = []
-
def on_batch_end(self, batch, logs={}):
-
self.losses.append(logs.get('loss'))
例子:記錄損失函數的歷史數據
-
class LossHistory(keras.callbacks.Callback):
-
def on_train_begin(self, logs={}):
-
self.losses = []
-
def on_batch_end(self, batch, logs={}):
-
self.losses.append(logs.get('loss'))
-
model = Sequential()
-
model.add(Dense(10, input_dim=784, kernel_initializer='uniform'))
-
model.add(Activation('softmax'))
-
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
-
history = LossHistory()
-
model.fit(X_train, Y_train, batch_size=128, epochs=20, verbose=0, callbacks=[history])
-
print history.losses
-
# outputs
-
'''
-
[0.66047596406559383, 0.3547245744908703, ..., 0.25953155204159617, 0.25901699725311789]
主要參考:
原文 : https://blog.csdn.net/weixin_38517705/article/details/82971147