Kears 使用:通過(guò)回調(diào)函數(shù)保存最佳準(zhǔn)確率下的模型操作
1:首先,我給我的MixTest文件夾里面分好了類的圖片進(jìn)行重命名(因?yàn)榉诸惖臅r(shí)候沒(méi)有注意導(dǎo)致命名有點(diǎn)不好)
def load_data(path): Rename the picture [a tool] for eachone in os.listdir(path): newname = eachone[7:] os.rename(path+"\\"+eachone,path+"\\"+newname)
但是需要注意的是:我們按照類重命名了以后,系統(tǒng)其實(shí)會(huì)按照?qǐng)D片來(lái)排序。這個(gè)時(shí)候你會(huì)看到同一個(gè)類的被排序在了一塊。這個(gè)時(shí)候你不要慌張,其實(shí)這個(gè)順序是完全不用擔(dān)心的。我們只是需要得到網(wǎng)絡(luò)對(duì)某一個(gè)圖片的輸出是怎么樣的判斷標(biāo)簽。這個(gè)順序?qū)W(wǎng)絡(luò)計(jì)算其權(quán)重完全是沒(méi)有任何的影響的
2:我在Keras中使用InceptionV3這個(gè)模型進(jìn)行訓(xùn)練,訓(xùn)練模型的過(guò)程啥的我在這里就不詳細(xì)說(shuō)了(畢竟這個(gè)東西有點(diǎn)像隨記那樣的東西)
我們?cè)贙eras的模型里面是可以通過(guò)
H.history["val_acc"]
H.history["val_loss"]
來(lái)的得到歷史交叉準(zhǔn)確率這樣的指標(biāo)
3:
對(duì)于每個(gè)epoch,我們都會(huì)計(jì)算一次val_acc和val_loss,我很希望保留下我最高的val_acc的模型,那該怎么辦呢?
這個(gè)時(shí)候我就會(huì)使用keras的callback函數(shù)
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])
上面的參數(shù)先查查文檔把。這里我就說(shuō)說(shuō)我的callbacks
callbacks=[tb(log_dir = 'E\John\log')]
這個(gè)是使用tensorboard來(lái)可視化訓(xùn)練過(guò)程的,后面是tensorboard的log輸出文件夾的路徑,在網(wǎng)絡(luò)訓(xùn)練的時(shí)候,相對(duì)應(yīng)的訓(xùn)練的狀態(tài)就會(huì)保存在這個(gè)文件夾下
打開終端,輸入
tensorboard --log_dir <your name of the log dir> --port <the port for tensorboard>
然后輸入終端指示的網(wǎng)址在瀏覽器中打開,就可以在tensorboard中看到你訓(xùn)練的狀態(tài)了
save_function:
這是一個(gè)類的實(shí)例化:
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, epoch, 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:
在這個(gè)epoch結(jié)束的時(shí)候,我會(huì)得到它的val_acc
當(dāng)這個(gè)val_acc為歷史最大值的時(shí)候,我就保存這個(gè)模型
在訓(xùn)練結(jié)束以后,你就挑出acc最大的就好啦(當(dāng)然,你可以命名為一樣的,最后的到的模型就不用挑了,直接就是acc最大的模型了)
補(bǔ)充知識(shí):Keras回調(diào)函數(shù)Callbacks使用詳解及訓(xùn)練過(guò)程可視化
介紹
內(nèi)容參考了keras中文文檔
回調(diào)函數(shù)Callbacks
回調(diào)函數(shù)是一組在訓(xùn)練的特定階段被調(diào)用的函數(shù)集,你可以使用回調(diào)函數(shù)來(lái)觀察訓(xùn)練過(guò)程中網(wǎng)絡(luò)內(nèi)部的狀態(tài)和統(tǒng)計(jì)信息。通過(guò)傳遞回調(diào)函數(shù)列表到模型的.fit()中,即可在給定的訓(xùn)練階段調(diào)用該函數(shù)集中的函數(shù)。
【Tips】雖然我們稱之為回調(diào)“函數(shù)”,但事實(shí)上Keras的回調(diào)函數(shù)是一個(gè)類,回調(diào)函數(shù)只是習(xí)慣性稱呼
keras.callbacks.Callback()
這是回調(diào)函數(shù)的抽象類,定義新的回調(diào)函數(shù)必須繼承自該類
類屬性:
params:字典,訓(xùn)練參數(shù)集(如信息顯示方法verbosity,batch大小,epoch數(shù))
model:keras.models.Model對(duì)象,為正在訓(xùn)練的模型的引用
回調(diào)函數(shù)以字典logs為參數(shù),該字典包含了一系列與當(dāng)前batch或epoch相關(guān)的信息。
目前,模型的.fit()中有下列參數(shù)會(huì)被記錄到logs中:
在每個(gè)epoch的結(jié)尾處(on_epoch_end),logs將包含訓(xùn)練的正確率和誤差,acc和loss,如果指定了驗(yàn)證集,還會(huì)包含驗(yàn)證集正確率和誤差val_acc)和val_loss,val_acc還額外需要在.compile中啟用metrics=[‘a(chǎn)ccuracy']。
在每個(gè)batch的開始處(on_batch_begin):logs包含size,即當(dāng)前batch的樣本數(shù)
在每個(gè)batch的結(jié)尾處(on_batch_end):logs包含loss,若啟用accuracy則還包含acc
from keras.callbacks import Callback
功能
History(訓(xùn)練可視化)
keras.callbacks.History()
該回調(diào)函數(shù)在Keras模型上會(huì)被自動(dòng)調(diào)用,History對(duì)象即為fit方法的返回值,可以使用history中的存儲(chǔ)的acc和loss數(shù)據(jù)對(duì)訓(xùn)練過(guò)程進(jìn)行可視化畫圖,代碼樣例如下:
history=model.fit(X_train, Y_train, validation_data=(X_test,Y_test), batch_size=16, epochs=20) ##或者 #history=model.fit(X_train,y_train,epochs=40,callbacks=callbacks, batch_size=32,validation_data=(X_test,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', 'Validation'], 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')
當(dāng)監(jiān)測(cè)值不再改善時(shí),該回調(diào)函數(shù)將中止訓(xùn)練
參數(shù)
monitor:需要監(jiān)視的量
patience:當(dāng)early stop被激活(如發(fā)現(xiàn)loss相比上一個(gè)epoch訓(xùn)練沒(méi)有下降),則經(jīng)過(guò)patience個(gè)epoch后停止訓(xùn)練。
verbose:信息展示模式
verbose = 0 為不在標(biāo)準(zhǔn)輸出流輸出日志信息
verbose = 1 為輸出進(jìn)度條記錄
verbose = 2 為每個(gè)epoch輸出一行記錄
默認(rèn)為 1
mode:‘a(chǎn)uto',‘min',‘max'之一,在min模式下,如果檢測(cè)值停止下降則中止訓(xùn)練。在max模式下,當(dāng)檢測(cè)值不再上升則停止訓(xùn)練。
ModelCheckpoint
該回調(diào)函數(shù)將在每個(gè)epoch后保存模型到filepath
filepath可以是格式化的字符串,里面的占位符將會(huì)被epoch值和傳入on_epoch_end的logs關(guān)鍵字所填入
例如,filepath若為weights.{epoch:02d-{val_loss:.2f}}.hdf5,則會(huì)生成對(duì)應(yīng)epoch和驗(yàn)證集loss的多個(gè)文件。
參數(shù)
filename:字符串,保存模型的路徑
monitor:需要監(jiān)視的值
verbose:信息展示模式,0或1
save_best_only:當(dāng)設(shè)置為True時(shí),將只保存在驗(yàn)證集上性能最好的模型
mode:‘a(chǎn)uto',‘min',‘max'之一,在save_best_only=True時(shí)決定性能最佳模型的評(píng)判準(zhǔn)則,例如,當(dāng)監(jiān)測(cè)值為val_acc時(shí),模式應(yīng)為max,當(dāng)檢測(cè)值為val_loss時(shí),模式應(yīng)為min。在auto模式下,評(píng)價(jià)準(zhǔn)則由被監(jiān)測(cè)值的名字自動(dòng)推斷。
save_weights_only:若設(shè)置為True,則只保存模型權(quán)重,否則將保存整個(gè)模型(包括模型結(jié)構(gòu),配置信息等)
period:CheckPoint之間的間隔的epoch數(shù)
Callbacks中可以同時(shí)使用多個(gè)以上兩個(gè)功能,舉例如下
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_train,epochs=40,callbacks=callbacks, batch_size=32,validation_data=(X_test,y_test))
在樣例中,EarlyStopping設(shè)置衡量標(biāo)注為val_loss,如果其連續(xù)4次沒(méi)有下降就提前停止 ,ModelCheckpoint設(shè)置衡量標(biāo)準(zhǔn)為val_loss,設(shè)置只保存最佳模型,保存路徑為best——model.h5
ReduceLROnPlateau
keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0)
當(dāng)評(píng)價(jià)指標(biāo)不在提升時(shí),減少學(xué)習(xí)率
當(dāng)學(xué)習(xí)停滯時(shí),減少2倍或10倍的學(xué)習(xí)率常常能獲得較好的效果。該回調(diào)函數(shù)檢測(cè)指標(biāo)的情況,如果在patience個(gè)epoch中看不到模型性能提升,則減少學(xué)習(xí)率
參數(shù)
monitor:被監(jiān)測(cè)的量 factor:每次減少學(xué)習(xí)率的因子,學(xué)習(xí)率將以lr = lr*factor的形式被減少
patience:當(dāng)patience個(gè)epoch過(guò)去而模型性能不提升時(shí),學(xué)習(xí)率減少的動(dòng)作會(huì)被觸發(fā)
mode:‘a(chǎn)uto',‘min',‘max'之一,在min模式下,如果檢測(cè)值觸發(fā)學(xué)習(xí)率減少。在max模式下,當(dāng)檢測(cè)值不再上升則觸發(fā)學(xué)習(xí)率減少。
epsilon:閾值,用來(lái)確定是否進(jìn)入檢測(cè)值的“平原區(qū)”
cooldown:學(xué)習(xí)率減少后,會(huì)經(jīng)過(guò)cooldown個(gè)epoch才重新進(jìn)行正常操作 min_lr:學(xué)習(xí)率的下限
使用樣例如下:
callbacks_test = [ keras.callbacks.ReduceLROnPlateau( #以val_loss作為衡量標(biāo)準(zhǔn) monitor='val_loss', # 學(xué)習(xí)率乘以factor factor=0.1, # It will get triggered after the validation loss has stopped improving # 當(dāng)被檢測(cè)的衡量標(biāo)準(zhǔn)經(jīng)過(guò)幾次沒(méi)有改善后就減小學(xué)習(xí)率 patience=10, ) ] model.fit(x, y,epochs=20,batch_size=16, callbacks=callbacks_test, validation_data=(x_val, y_val))
CSVLogger
keras.callbacks.CSVLogger(filename, separator=',', append=False)
將epoch的訓(xùn)練結(jié)果保存在csv文件中,支持所有可被轉(zhuǎn)換為string的值,包括1D的可迭代數(shù)值如np.ndarray.
參數(shù)
fiename:保存的csv文件名,如run/log.csv
separator:字符串,csv分隔符
append:默認(rèn)為False,為True時(shí)csv文件如果存在則繼續(xù)寫入,為False時(shí)總是覆蓋csv文件
以上這篇Kears 使用:通過(guò)回調(diào)函數(shù)保存最佳準(zhǔn)確率下的模型操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python異步在非阻塞子進(jìn)程中運(yùn)行命令詳解
這篇文章主要為大家介紹了Python異步在非阻塞子進(jìn)程中運(yùn)行命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03pyqt5 鍵盤監(jiān)聽(tīng)按下enter 就登陸的實(shí)例
今天小編就為大家分享一篇pyqt5 鍵盤監(jiān)聽(tīng)按下enter 就登陸的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06使用python如何提取JSON數(shù)據(jù)指定內(nèi)容
這篇文章主要介紹了使用python如何提取JSON數(shù)據(jù)指定內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python清除指定目錄內(nèi)所有文件中script的方法
這篇文章主要介紹了python清除指定目錄內(nèi)所有文件中script的方法,涉及Python針對(duì)文件、字符串及正則匹配操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06Python類和對(duì)象的定義與實(shí)際應(yīng)用案例分析
這篇文章主要介紹了Python類和對(duì)象的定義與實(shí)際應(yīng)用,結(jié)合三個(gè)具體案例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類與對(duì)象的定義、應(yīng)用、設(shè)計(jì)模式等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Python的ORM框架中SQLAlchemy庫(kù)的查詢操作的教程
這篇文章主要介紹了Python的ORM框架中SQLAlchemy庫(kù)的查詢操作的教程,SQLAlchemy用來(lái)操作數(shù)據(jù)庫(kù)十分方便,需要的朋友可以參考下2015-04-04Python超簡(jiǎn)單容易上手的畫圖工具庫(kù)推薦
今天小編給大家分享一款很棒的python畫圖工具庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-05-05找Python安裝目錄,設(shè)置環(huán)境路徑以及在命令行運(yùn)行python腳本實(shí)例
這篇文章主要介紹了找Python安裝目錄,設(shè)置環(huán)境路徑以及在命令行運(yùn)行python腳本實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03