问题
10个epoch,运行到最后一个时,训练数据集的损失函数显著增大
解决步骤
- 检查learning rate,发现学习率平滑减小,符合预期没有问题
- 检查梯度截断是否有效。梯度上没有问题。
- 检查adam之外的优化方法。adam没有问题
- 检查数据集是否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原理了解的不多,问题的实质还需要更多实验和理论才能搞清楚了。