1. 程式人生 > 程式設計 >基於keras中的回撥函式用法說明

基於keras中的回撥函式用法說明

keras訓練

fit(
 self,x,y,batch_size=32,nb_epoch=10,verbose=1,callbacks=[],validation_split=0.0,validation_data=None,shuffle=True,class_weight=None,sample_weight=None
)

1. x:輸入資料。如果模型只有一個輸入,那麼x的型別是numpy array,如果模型有多個輸入,那麼x的型別應當為list,list的元素是對應於各個輸入的numpy array。如果模型的每個輸入都有名字,則可以傳入一個字典,將輸入名與其輸入資料對應起來。

2. y:標籤,numpy array。如果模型有多個輸出,可以傳入一個numpy array的list。如果模型的輸出擁有名字,則可以傳入一個字典,將輸出名與其標籤對應起來。

3. batch_size:整數,指定進行梯度下降時每個batch包含的樣本數。訓練時一個batch的樣本會被計算一次梯度下降,使目標函式優化一步。

4. nb_epoch:整數,訓練的輪數,訓練資料將會被遍歷nb_epoch次。Keras中nb開頭的變數均為"number of"的意思

5. verbose:日誌顯示,0為不在標準輸出流輸出日誌資訊,1為輸出進度條記錄,2為每個epoch輸出一行記錄

6. callbacks:list,其中的元素是keras.callbacks.Callback的物件。這個list中的回撥函式將會在訓練過程中的適當時機被呼叫,參考回撥函式

7. validation_split:0~1之間的浮點數,用來指定訓練集的一定比例資料作為驗證集。驗證集將不參與訓練,並在每個epoch結束後測試的模型的指標,如損失函式、精確度等。

8. validation_data:形式為(X,y)或(X,y,sample_weights)的tuple,是指定的驗證集。此引數將覆蓋validation_spilt。

9. shuffle:布林值,表示是否在訓練過程中每個epoch前隨機打亂輸入樣本的順序。

10. class_weight:字典,將不同的類別對映為不同的權值,該引數用來在訓練過程中調整損失函式(只能用於訓練)。該引數在處理非平衡的訓練資料(某些類的訓練樣本數很少)時,可以使得損失函式對樣本數不足的資料更加關注。

11. sample_weight:權值的numpy array,用於在訓練時調整損失函式(僅用於訓練)。可以傳遞一個1D的與樣本等長的向量用於對樣本進行1對1的加權,或者在面對時序資料時,傳遞一個的形式為(samples,sequence_length)的矩陣來為每個時間步上的樣本賦不同的權。這種情況下請確定在編譯模型時添加了sample_weight_mode='temporal'。

fit函式返回一個History的物件,其History.history屬性記錄了損失函式和其他指標的數值隨epoch變化的情況,如果有驗證集的話,也包含了驗證集的這些指標變化情況。

儲存模型結構、訓練出來的權重、及優化器狀態

keras 的 callback引數可以幫助我們實現在訓練過程中的適當時機被呼叫。實現實時儲存訓練模型以及訓練引數。

keras.callbacks.ModelCheckpoint(
 filepath,monitor='val_loss',verbose=0,save_best_only=False,save_weights_only=False,mode='auto',period=1
)

1. filename:字串,儲存模型的路徑

2. monitor:需要監視的值

3. verbose:資訊展示模式,0或1

4. save_best_only:當設定為True時,將只儲存在驗證集上效能最好的模型

5. mode:‘auto',‘min',‘max'之一,在save_best_only=True時決定效能最佳模型的評判準則,例如,當監測值為val_acc時,模式應為max,當檢測值為val_loss時,模式應為min。在auto模式下,評價準則由被監測值的名字自動推斷。

6. save_weights_only:若設定為True,則只儲存模型權重,否則將儲存整個模型(包括模型結構,配置資訊等)

7. period:CheckPoint之間的間隔的epoch數

當驗證損失不再繼續降低時,如何中斷訓練?當監測值不再改善時中止訓練

用EarlyStopping回撥函式

from keras.callbacksimport EarlyStopping 

keras.callbacks.EarlyStopping(
 monitor='val_loss',patience=0,mode='auto'
)

model.fit(X,validation_split=0.2,callbacks=[early_stopping])

1. monitor:需要監視的量

2. patience:當early stop被啟用(如發現loss相比上一個epoch訓練沒有下降),則經過patience個epoch後停止訓練。

3. verbose:資訊展示模式

4. mode:‘auto',‘min',‘max'之一,在min模式下,如果檢測值停止下降則中止訓練。在max模式下,當檢測值不再上升則停止訓練。

學習率動態調整1

keras.callbacks.LearningRateScheduler(schedule)

schedule:函式,該函式以epoch號為引數(從0算起的整數),返回一個新學習率(浮點數)

也可以讓keras自動調整學習率

keras.callbacks.ReduceLROnPlateau(
 monitor='val_loss',factor=0.1,patience=10,epsilon=0.0001,cooldown=0,min_lr=0
)

1. monitor:被監測的量

2. factor:每次減少學習率的因子,學習率將以lr = lr*factor的形式被減少

3. patience:當patience個epoch過去而模型效能不提升時,學習率減少的動作會被觸發

4. mode:‘auto',‘min',‘max'之一,在min模式下,如果檢測值觸發學習率減少。在max模式下,當檢測值不再上升則觸發學習率減少。

5. epsilon:閾值,用來確定是否進入檢測值的“平原區”

6. cooldown:學習率減少後,會經過cooldown個epoch才重新進行正常操作

7. min_lr:學習率的下限

當學習停滯時,減少2倍或10倍的學習率常常能獲得較好的效果

學習率動態2

def step_decay(epoch):
 initial_lrate = 0.01
 drop = 0.5
 epochs_drop = 10.0
 lrate = initial_lrate * math.pow(drop,math.floor((1+epoch)/epochs_drop))
 return lrate
lrate = LearningRateScheduler(step_decay)
sgd = SGD(lr=0.0,momentum=0.9,decay=0.0,nesterov=False)
model.fit(train_set_x,train_set_y,validation_split=0.1,nb_epoch=200,batch_size=256,callbacks=[lrate])

如何記錄每一次epoch的訓練/驗證損失/準確度?

Model.fit函式會返回一個 History 回撥,該回調有一個屬性history包含一個封裝有連續損失/準確的lists。程式碼如下:

hist = model.fit(X,validation_split=0.2)
print(hist.history)

Keras輸出的loss,val這些值如何儲存到文字中去

Keras中的fit函式會返回一個History物件,它的History.history屬性會把之前的那些值全儲存在裡面,如果有驗證集的話,也包含了驗證集的這些指標變化情況,具體寫法

hist=model.fit(train_set_x,nb_epoch=nb_epoch,validation_split=0.1)
with open('log_sgd_big_32.txt','w') as f:
 f.write(str(hist.history))

示例,多個回撥函式用逗號隔開

# checkpoint
checkpointer = ModelCheckpoint(filepath="./checkpoint.hdf5",verbose=1)
# learning rate adjust dynamic
lrate = ReduceLROnPlateau(min_lr=0.00001)

answer.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
# Note: you could use a Graph model to avoid repeat the input twice
answer.fit(
 [inputs_train,queries_train,inputs_train],answers_train,nb_epoch=5000,validation_data=([inputs_test,queries_test,inputs_test],answers_test),callbacks=[checkpointer,lrate]
)

keras回撥函式中的Tensorboard

keras.callbacks.TensorBoard(log_dir='./Graph',histogram_freq=0,write_graph=True,write_images=True)

tbCallBack = keras.callbacks.TensorBoard(log_dir='./Graph',write_images=True)
...
model.fit(...inputs and parameters...,callbacks=[tbCallBack])
tensorboard --logdir path_to_current_dir/Graph 

或者

from keras.callbacks import TensorBoard

tensorboard = TensorBoard(log_dir='./logs',write_images=False)
# define model
model.fit(X_train,Y_train,batch_size=batch_size,epochs=nb_epoch,validation_data=(X_test,Y_test),callbacks=[tensorboard])

補充知識:Keras中的回撥函式(callback)的使用與介紹

以前我在訓練的時候,都是直接設定一個比較大的epoch,跑完所有的epoch之後再根據資料去調整模型與引數。這樣做會比較耗時,例如說訓練在某一個epoch開始已經過擬合了,後面繼續訓練意義就不大了。

在書上看到的callback函式很好的解決了這個問題,它能夠監測訓練過程中的loss或者acc這些指標,一旦觀察到損失不再改善之後,就可以中止訓練,節省時間。下面記錄一下

介紹:

(選自《python深度學習》)

回撥函式(callback)是在呼叫fit時傳入模型的一個物件,它在訓練過程中的不同時間點都會被模型呼叫。它可以訪問關於模型狀態與效能的所有可用資料,還可以採取行動:中斷訓練、儲存模型、載入一組不同的權重或改變模型的狀態。

部分回撥函式:

1.ModelCheckpoint與EarlyStopping

監控目標若在指定輪數內不再改善,可利用EarlyStopping來中斷訓練。

可配合ModelCheckpoint使用,該回調函式可不斷地儲存模型,亦可以只儲存某一epoch最佳效能模型

import keras
callbacks_list=[
 keras.callbacks.EarlyStopping(
  monitor='acc',#監控精度
  patience=5,#5輪內不改善就中止
),keras.callbacks.ModelCheckpoint(
  filepath='C:/apple/my_model.h5',#模型儲存路徑
  monitor='val_loss',#檢測驗證集損失值
  save_best_only=True#是否只儲存最佳模型
 )
]
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
model.fit(x,epochs=10,callbacks=callbacks_list,#在這裡放入callback函式
   validation_data=(x_val,y_val)
 )

2.ReduceLROnPlateau回撥函式

如果驗證損失不再改善,可以使用該回調函式來降低學習率。

import keras
 
callbacks_list=[
 keras.callbacks.ReduceLROnPlateau(
  monitor='val_loss',#監控精度
  patienece=5,# 5輪內不改善就改變
  factor=0.1#學習率變為原來的0.1
)
]
model.compile(optimizer='rmsprop',y_val)
 )

以上這篇基於keras中的回撥函式用法說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。