1. 程式人生 > >Kears 使用:通過回撥函式儲存最佳準確率下的模型

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最大的模型了)