问题背景
今天,我在使用点云数据集(modelnet10_ply)训练一个图分类模型的时候遇上这么一个离谱的问题。我在训练过程中发现,模型的准确率一直都在0.11徘徊。可当我使用相似的modelnet10_h5数据采集时,准确率却会在一次次训练中得到优化。
问题分析
首先我检查了ply类型数据集的标签是否能够对应的上,后面发现没问题。后面我突然想到,ply数据集是经过我整理后的数据集,我将相同一类的数据放在一个文件夹,并且我编写的ply文件读取器,是按一个一个文件夹读取的。我就想会不会是训练的时候同一类别的数据集太集中,没有乱序导致的
解决方法
后面我用Dataloader的shuffle将数据集打乱
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
最后恢复了正常
why
为什么会这样呢?按照我的理解,由于我使用的数据集比较大,每个类的数据集个数也比较多,所以在训练过程中,假如训练同一片数据集都是同一类,由于类别相同的数据具有相似的结构够,所以很可能导致在经过一片相同类别的数据训练后。模型出现一种假饱和状态,也就是说参数饱和了对于这个类,这个过程参数甚至都不用怎么调整了。当这片数据训练完了,到下一类数据集,突然间模型不适应了,就会突然间准确率下降,模型会朝着如何将这类数据集分类得更好去优化,经过大量数据集训练后,慢慢就将前面分类上一个类别的能力给遗忘掉了,所以说模型一直实在这么一个遗忘,记忆,遗忘,记忆的过程,始终最多只能分类一个类。这里为什么我的准确率保持一个0.11也得到解释,因为经过一趟训练后,模型基本上只对最后一个类别具备较好的分类能力,所以说准确率一直都是最后一个类跟全部数据集之比。刚刚好我里面有十个类,占十分之一刚好得到验证。所以说大家在使用较大数据集训练模型的时候一定要,注意将数据集乱序,打乱了才能学到一个总体能力。还有看到准确率或者损失一直不变也可以想一下这个原因