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, 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:
在這個epoch結束的時候,我會得到它的val_acc
當這個val_acc為歷史最大值的時候,我就儲存這個模型
在訓練結束以後,你就挑出acc最大的就好啦(當然,你可以命名為一樣的,最後的到的模型就不用挑了,直接就是acc最大的模型了)