機器學習實踐:TensorFlow最後一個epoch訓練損失函式顯著增大

公眾號YueTan發表於2020-12-27

問題

10個epoch,執行到最後一個時,訓練資料集的損失函式顯著增大
在這裡插入圖片描述

解決步驟

  1. 檢查learning rate,發現學習率平滑減小,符合預期沒有問題
  2. 檢查梯度截斷是否有效。梯度上沒有問題。
  3. 檢查adam之外的優化方法。adam沒有問題
  4. 檢查資料集是否shuffle。

結論

事實證明問題確實出在tensorflow的資料流水線上。如果把epoch的部分增加到這裡,則整體是平滑的

def __call__(self, annotations_dir, batch_size=8, shuffle=False):
        self.data_reader = DataReader(annotations_dir)
        dataset = tf.data.Dataset.from_generator(self.data_reader.iter,
                                                 output_types=(tf.float32, tf.float32),
                                                 output_shapes=([self.img_size, self.img_size, 3], [None, 5]))  # for distribute data
        dataset = dataset.repeat(10)

如果是寫到自己的訓練迴圈裡,則有問題

for epoch in range(10):
        for image_data, target in trainset:
            train_step(image_data, target)
        model.save_weights("../weights/yolov5")

至於問題的實質還需要更多實驗才能搞清楚了。

相關文章