Kears 使用:通過回撥函式儲存最佳準確率下的模型操作
1:首先,我給我的MixTest資料夾裡面分好了類的圖片進行重新命名(因為分類的時候沒有注意導致命名有點不好)
def load_data(path): Rename the picture [a tool] for eachone in os.listdir(path): newname = eachone[7:] os.rename(path+"\\"+eachone,path+"\\"+newname)
但是需要注意的是:我們按照類重新命名了以後,系統其實會按照圖片來排序。這個時候你會看到同一個類的被排序在了一塊。這個時候你不要慌張,其實這個順序是完全不用擔心的。我們只是需要得到網路對某一個圖片的輸出是怎麼樣的判斷標籤。這個順序對網路計算其權重完全是沒有任何的影響的
2:我在Keras中使用InceptionV3這個模型進行訓練,訓練模型的過程啥的我在這裡就不詳細說了(畢竟這個東西有點像隨記那樣的東西)
我們在Keras的模型裡面是可以通過
H.history["val_acc"]
H.history["val_loss"]
來的得到歷史交叉準確率這樣的指標
3:
對於每個epoch,我們都會計算一次val_acc和val_loss,我很希望保留下我最高的val_acc的模型,那該怎麼辦呢?
這個時候我就會使用keras的callback函式
H = model.fit_generator(train_datagen.flow(X_train,Y_train,batch_size=batchsize),validation_data=(X_test,Y_test),steps_per_epoch=(X_train.shape[0]) // batchsize,epochs=epoch,verbose=1,callbacks=[tb(log_dir='E:\John\log'),save_function])
上面的引數先查查文件把。這裡我就說說我的callbacks
callbacks=[tb(log_dir = 'E\John\log')]
這個是使用tensorboard來視覺化訓練過程的,後面是tensorboard的log輸出資料夾的路徑,在網路訓練的時候,相對應的訓練的狀態就會儲存在這個資料夾下
開啟終端,輸入
tensorboard --log_dir <your name of the log dir> --port <the port for tensorboard>
然後輸入終端指示的網址在瀏覽器中開啟,就可以在tensorboard中看到你訓練的狀態了
save_function:
這是一個類的例項化:
class Save(keras.callbacks.Callback): def __init__(self): self.max_acc = 0.0 def on_epoch_begin(self,epoch,logs=None): pass def on_epoch_end(self,logs=None): self.val_acc = logs["val_acc"] if epoch != 0: if self.val_acc > self.max_acc and self.val_acc > 0.8: model.save("kears_model_"+str(epoch)+ "_acc="+str(self.val_acc)+".h5") self.max_acc = self.val_acc save_function = Save()
這裡繼承了kears.callbacks.Callback
看看on_epoch_end:
在這個epoch結束的時候,我會得到它的val_acc
當這個val_acc為歷史最大值的時候,我就儲存這個模型
在訓練結束以後,你就挑出acc最大的就好啦(當然,你可以命名為一樣的,最後的到的模型就不用挑了,直接就是acc最大的模型了)
補充知識:Keras回撥函式Callbacks使用詳解及訓練過程視覺化
介紹
內容參考了keras中文文件
回撥函式Callbacks
回撥函式是一組在訓練的特定階段被呼叫的函式集,你可以使用回撥函式來觀察訓練過程中網路內部的狀態和統計資訊。通過傳遞迴調函式列表到模型的.fit()中,即可在給定的訓練階段呼叫該函式集中的函式。
【Tips】雖然我們稱之為回撥“函式”,但事實上Keras的回撥函式是一個類,回撥函式只是習慣性稱呼
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
from keras.callbacks import Callback
功能
History(訓練視覺化)
keras.callbacks.History()
該回調函式在Keras模型上會被自動呼叫,History物件即為fit方法的返回值,可以使用history中的儲存的acc和loss資料對訓練過程進行視覺化畫圖,程式碼樣例如下:
history=model.fit(X_train,batch_size=16,epochs=20) ##或者 #history=model.fit(X_train,y_train,epochs=40,callbacks=callbacks,batch_size=32,y_test)) fig1,ax_acc = plt.subplots() plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.title('Model - Accuracy') plt.legend(['Training','Validation'],loc='lower right') plt.show() fig2,ax_loss = plt.subplots() plt.xlabel('Epoch') plt.ylabel('Loss') plt.title('Model- Loss') plt.legend(['Training',loc='upper right') plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.show()
EarlyStopping
keras.callbacks.EarlyStopping(monitor='val_loss',patience=0,verbose=0,mode='auto')
當監測值不再改善時,該回調函式將中止訓練
引數
monitor:需要監視的量
patience:當early stop被啟用(如發現loss相比上一個epoch訓練沒有下降),則經過patience個epoch後停止訓練。
verbose:資訊展示模式
verbose = 0 為不在標準輸出流輸出日誌資訊
verbose = 1 為輸出進度條記錄
verbose = 2 為每個epoch輸出一行記錄
預設為 1
mode:‘auto',‘min',‘max'之一,在min模式下,如果檢測值停止下降則中止訓練。在max模式下,當檢測值不再上升則停止訓練。
ModelCheckpoint
該回調函式將在每個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數
Callbacks中可以同時使用多個以上兩個功能,舉例如下
callbacks = [EarlyStopping(monitor='val_loss',patience=8),ModelCheckpoint(filepath='best_model.h5',monitor='val_loss',save_best_only=True)] history=model.fit(X_train,y_test))
在樣例中,EarlyStopping設定衡量標註為val_loss,如果其連續4次沒有下降就提前停止,ModelCheckpoint設定衡量標準為val_loss,設定只儲存最佳模型,儲存路徑為best——model.h5
ReduceLROnPlateau
keras.callbacks.ReduceLROnPlateau(monitor='val_loss',factor=0.1,patience=10,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:學習率的下限
使用樣例如下:
callbacks_test = [ keras.callbacks.ReduceLROnPlateau( #以val_loss作為衡量標準 monitor='val_loss',# 學習率乘以factor factor=0.1,# It will get triggered after the validation loss has stopped improving # 當被檢測的衡量標準經過幾次沒有改善後就減小學習率 patience=10,) ] model.fit(x,y,epochs=20,callbacks=callbacks_test,validation_data=(x_val,y_val))
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檔案
以上這篇Kears 使用:通過回撥函式儲存最佳準確率下的模型操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。