神经网络训练一开始准确率很高然后逐渐下降的问题排查

现象

神经网络训练,一开始准确率很高,然后逐渐下降。如下所示:

Epoch 	 Time 	 Train Loss 	 Train ACC 	 Val Loss 	 Val ACC 	 Test Loss 	 Test ACC 	 LR
1	 197.8234 	 0.0053 	 0.8645 	 0.0412 	 0.1443 	 0.0412 	 0.1443 	 0.0100
2	 108.6638 	 0.0084 	 0.7311 	 0.0272 	 0.1443 	 0.0272 	 0.1443 	 0.0100
3	 108.4892 	 0.0095 	 0.6777 	 0.0267 	 0.1443 	 0.0267 	 0.1443 	 0.0100
4	 108.8819 	 0.0087 	 0.7102 	 0.0269 	 0.1443 	 0.0269 	 0.1443 	 0.0100
5	 108.8337 	 0.0065 	 0.7712 	 0.0504 	 0.1443 	 0.0504 	 0.1443 	 0.0100
6	 109.4179 	 0.0061 	 0.8071 	 0.0624 	 0.1443 	 0.0624 	 0.1443 	 0.0100
7	 109.2300 	 0.0057 	 0.8349 	 0.0762 	 0.1443 	 0.0762 	 0.1443 	 0.0075
8	 109.2820 	 0.0101 	 0.6432 	 0.0245 	 0.1443 	 0.0245 	 0.1443 	 0.0075

具体现象是 Train ACC 一开始特别高,但 Val ACC 很低。随着 epoch 增加, Train ACC 开始下降,Val ACC 几乎不变。

排查过程

把 Argumentation 部分的代码删了,发现还是这样。我是用分布式训练,所以我把进程数量改成了1再试,发现还是这样。

最后掏出了积灰的单机训练代码,逐部分调试,最后发现原因是 Dataloader 的 shuffle=False。开启 shuffle 后,数据就正常了。

为啥之前不开 shuffle 呢,我也忘了……分布式训练时可以在DistributedSampler可以设置shuffle=False。代码如下所示:

trainsampler = DistributedSampler(train, shuffle=True)
trainloader = DataLoader(train, batch_size=128, num_workers=6, sampler=trainsampler)