机器学习实践:TensorFlow最后一个epoch训练损失函数显著增大

问题

10个epoch,运行到最后一个时,训练数据集的损失函数显著增大
机器学习实践:TensorFlow最后一个epoch训练损失函数显著增大_第1张图片

解决步骤

  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")

其实,如果是经验丰富,大概一开头就可以猜出大概的解决方案,不用像我到处检测。因为问题出在一个新的epoch开头时突然异样。由于对tf.data原理了解的不多,问题的实质还需要更多实验和理论才能搞清楚了。

你可能感兴趣的:(机器学习,人工智能,tensorflow)