zkyseu/O2SFormer

grad_norm非常大,loss不收敛

Closed this issue · 8 comments

您好,对于我自己的车道线训练集,每张图像车道线条数相较CULane更好,例如有10+条,我用您的代码训练自己数据集时,发现log中 grad_norm 非常大(大概6487986.0000这种量级),且一直不下降。我调整学习率、优化器grad_clip中的max_norm参数都无效。请问您是否遇到过 或者 有什么好的调整思路,谢谢!

@guvcolie 您好,抱歉回复晚了。首先您确定一下config是否设置正确,包括数据增强是否合理、车道线类别是否正确。其次建议您使用ResNet50骨干网络对应的O2SFormer,并加载CULane的权重作为预训练权重。最后,需要指明的一个点,由于O2SFomrer基于Transformer架构,因此它对数据量很敏感,所以如果您数据数据量较小,效果也许不会很理想。

@guvcolie 您好,抱歉回复晚了。首先您确定一下config是否设置正确,包括数据增强是否合理、车道线类别是否正确。其次建议您使用ResNet50骨干网络对应的O2SFormer,并加载CULane的权重作为预训练权重。最后,需要指明的一个点,由于O2SFomrer基于Transformer架构,因此它对数据量很敏感,所以如果您数据数据量较小,效果也许不会很理想。

感谢回复!

  1. 数据增强目前用的是代码中原始逻辑
  2. 关于车道线类别,其实我一直没理解代码中为什么设置为4类,我看您的代码中['ln1', 'ln2', 'ln3', 'ln4']。按常理来讲,车道线就应该是2类呀(前景类、背景类),这个请再解答一下,谢谢
  3. CULane权重作为预训练我再尝试一下
  4. 我的数据量很大,比CULane至少大一个量级;关键是模型刚开始训练梯度就已经很大了,且一直不降,应该暂时和数据量无关

@guvcolie 您好,关于问题2是这样的,4类是因为CULane数据集中图片中最多4条车道线。我们将每一条车道线都看成一个单独的实例(也就是单独类),例如在传入标签时如果图像中只有三条车道线,那么分类标签就是0 1 1 1(假设只有右边三条车道线)。这样的思路在CLRNet中也有体现。这种方式相较于不区分车道线实例来说能增加监督信号,提高学习的效率。
另外关于梯度很大,您的loss是不是也是异常的?如果loss异常,可以具体看看是哪个loss导致的异常。

@guvcolie 另外您可以按照我上面的关于分类的解答,看一下传入的标签是不是正确的。如果您只区分前景和背景,传入标签都是1111的话可能会导致训练异常的。

@guvcolie 您好,关于问题2是这样的,4类是因为CULane数据集中图片中最多4条车道线。我们将每一条车道线都看成一个单独的实例(也就是单独类),例如在传入标签时如果图像中只有三条车道线,那么分类标签就是0 1 1 1(假设只有右边三条车道线)。这样的思路在CLRNet中也有体现。这种方式相较于不区分车道线实例来说能增加监督信号,提高学习的效率。 另外关于梯度很大,您的loss是不是也是异常的?如果loss异常,可以具体看看是哪个loss导致的异常。

@zkyseu 您好

  1. 对于车道线类别,我的训练集每个图片都有很多车道线(不只4条,有的10+条),这样的话把每个车道线都看成单独的实例,会不会使模型非常复杂呢?我把这块改成了2分类,seg loss时只预测0/1分割;
  2. 您上文说的“那么分类标签就是0 1 1 1(假设只有右边三条车道线)”,但咱们怎么确定是0111,而不是1011或1110呢?这里没太理解;
  3. 用我自己的训练集,总loss在10左右,我复现您的CULane训练过程,我记得总loss在2左右;我感觉应该loss应该不算异常,您怎么看? 我通过调整lr、max_grad_norm等参数,都不起作用

@guvcolie 您好,关于问题2是这样的,4类是因为CULane数据集中图片中最多4条车道线。我们将每一条车道线都看成一个单独的实例(也就是单独类),例如在传入标签时如果图像中只有三条车道线,那么分类标签就是0 1 1 1(假设只有右边三条车道线)。这样的思路在CLRNet中也有体现。这种方式相较于不区分车道线实例来说能增加监督信号,提高学习的效率。 另外关于梯度很大,您的loss是不是也是异常的?如果loss异常,可以具体看看是哪个loss导致的异常。

@zkyseu 您好

  1. 对于车道线类别,我的训练集每个图片都有很多车道线(不只4条,有的10+条),这样的话把每个车道线都看成单独的实例,会不会使模型非常复杂呢?我把这块改成了2分类,seg loss时只预测0/1分割;
  2. 您上文说的“那么分类标签就是0 1 1 1(假设只有右边三条车道线)”,但咱们怎么确定是0111,而不是1011或1110呢?这里没太理解;
  3. 用我自己的训练集,总loss在10左右,我复现您的CULane训练过程,我记得总loss在2左右;我感觉应该loss应该不算异常,您怎么看? 我通过调整lr、max_grad_norm等参数,都不起作用

@guvcolie 1、O2Sformer严格上来说与实力分割的思路类似(只不过我们是基于anchor的方法)。因此每条车道线都是单独一个实例,其实只是数据处理部分复杂了,但从训练效果来看是优于不区分的(这个其实在CLRNet和CondLaneNet中已经涉及了)。所以对应的分割损失其实也是要区分车道线的,这也是我估计导致梯度异常的原因。另外,如果您不区分车道线,那么就需要修改一下数据增强。
2、这个其实涉及了数据预处理,具体代码在这里。通过数据预处理模型直接告诉模型输入图像中到底有几条车道线,以及相对应的位置。
3、按照您上面的描述,我觉得大概率可能是出现在标签的问题上了。您可以对照一下CULane上,我们方法传入的标签是什么内容,然后对照着看看您方法中传入标签(尤其是分类标签)是否正确。

@guvcolie 1、O2Sformer严格上来说与实力分割的思路类似(只不过我们是基于anchor的方法)。因此每条车道线都是单独一个实例,其实只是数据处理部分复杂了,但从训练效果来看是优于不区分的(这个其实在CLRNet和CondLaneNet中已经涉及了)。所以对应的分割损失其实也是要区分车道线的,这也是我估计导致梯度异常的原因。另外,如果您不区分车道线,那么就需要修改一下数据增强。 2、这个其实涉及了数据预处理,具体代码在这里。通过数据预处理模型直接告诉模型输入图像中到底有几条车道线,以及相对应的位置。 3、按照您上面的描述,我觉得大概率可能是出现在标签的问题上了。您可以对照一下CULane上,我们方法传入的标签是什么内容,然后对照着看看您方法中传入标签(尤其是分类标签)是否正确。

@zkyseu 好的,我再详细排查下,感谢您的回复。我先close掉这个issue了,如果后续有问题我再reopen请教您!