keras使用callback造自己的monitor函數

fit_generator函數

在這裏插入圖片描述

callback類

在這裏插入圖片描述

keras.callbacks.ModelCheckpoint是一個常見的callback類,其重寫了on_epoch_end函數,在每個epoch結束保存模型數據進入文件。

  • keras.callbacks.History類主要記錄每一次epoch訓練的結果,包含loss以及acc的值;
  • keras.callbacks.ProgbarLogger類實現訓練中間狀態數據信息的輸出,主要涉及進度相關信息。
  1. 訓練過程中,每次權重的更新都是在一個batch上進行一次,是基於batch量的數據爲單位進行權重的更新;

  2. 基於生成器模型訓練數據,可以提升效率,降低對物理服務器性能,尤其是內存的要求;

  3. 訓練過程中,callback函數執行了大量的工作,包括loss、acc值的記錄,以及訓練中間結果的日誌反饋,最重要的是模型數據的輸出,也是通過callback的方式實現;

  4. 訓練和驗證的邏輯近乎一樣,訓練要更新權重,但是驗證過程,僅僅更新網絡狀態,不涉及權重(loss以及acc參數)信息的更新;

  5. Keras採用了生成器,裝飾器,回調等編程思想,另外,對矩陣運算,例如numpy.dot以及numpy.multiply的數學邏輯都有一定要求,對python編程要求還是比較高滴。

我的新的callback函數

class F1ScoreCallback(Callback):
    def __init__(self, predict_batch_size=1024, include_on_batch=False):
        super(F1ScoreCallback, self).__init__()
        self.predict_batch_size = predict_batch_size
        self.include_on_batch = include_on_batch

    def on_batch_begin(self, batch, logs={}):
        pass

    def on_train_begin(self, logs={}):
        if not ('avg_f1_score_val' in self.params['metrics']):
            self.params['metrics'].append('avg_f1_score_val')

    def on_batch_end(self, batch, logs={}):
        if (self.include_on_batch):
            logs['avg_f1_score_val'] = float('-inf')

    def on_epoch_end(self, epoch, logs={}):
        logs['avg_f1_score_val'] = float('-inf')
        if (self.validation_data):
            y_predict, predict2, predict3 = self.model.predict(self.validation_data[0],
                                           batch_size=self.predict_batch_size)
            y_predict[y_predict >= 0.5] = 1
            y_predict[y_predict < 0.5] = 0
            f1 = f1_score(self.validation_data[1], y_predict, average='macro')
            # print("macro f1_score %.4f " % f1)
            f2 = f1_score(self.validation_data[1], y_predict, average='micro')
            # print("micro f1_score %.4f " % f2)
            avgf1=(f1 + f2) / 2
            # print("avg_f1_score %.4f " % (avgf1))
            logs['avg_f1_score_val'] =avgf1

只要加入log中,然後在monitor選擇你自己定義的log函數名字,就能在一個epoch後的val中運行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章