你训练的神经网络不对头的37个原因
AI公园
•
文章来源: AI公园
•
•
人工智能
大家都遇到过这种情况,训练的时候没什么问题,测试的时候就不对劲了,想找问题,感觉无处入手,那么今天,给你37个建议,看看再说吧。
作者:Slav Ivanov
编译:ronghuaiyang
导读
大家都遇到过这种情况,训练的时候没什么问题,测试的时候就不对劲了,想找问题,感觉无处入手,那么今天,给你37个建议,看看再说吧。
这个网络在过去12个小时中一直在进行训练。一切看起来都很好:梯度在流动,损失在降低。但是接下来的预测结果是:所有都是0,所有都是背景,没有检测到任何东西。“我做错了什么?”—我问我的电脑,电脑没睬我。
你从哪里开始检查你的模型是否正在输出垃圾(例如预测所有输出的平均值,或者它的准确性非常差)?
由于一些原因,网络可能不会进行训练。在许多调试的过程中,我经常发现自己在执行相同的检查。我把我的经验和最好的想法整理在这个方便的列表里。我希望它们对你也有用。
0. 如何使用这个指南?
很多事情都可能出错。但其中一些更有可能出现问题。我通常以这张简短的清单作为紧急第一反应:
- 从一个已知对这类数据有效的简单模型开始(例如,图像的VGG)。如果可能的话,使用标准的损失。
- 关闭所有花哨的功能,例如正则化和数据扩充。
- 如果对模型进行finetune,请仔细检查预处理,因为预处理应该与原始模型的训练相同。
- 验证输入数据是否正确。
- 从一个很小的数据集(2-20个样本)开始。对其进行过拟合,并逐渐添加更多数据。
- 开始逐步添加所有遗漏的部分:增强/正则化,自定义损失函数,尝试更复杂的模型。
如果上面的步骤没有什么用,那么就从下面的列表开始,逐一验证。
I. 数据集的问题
1. 检查你的输入数据
检查你正在向网络提供的输入数据是否有意义。例如,我不止一次地搞混了图像的宽度和高度。有时,我会不小心把输入全部搞成了0。或者我会反复的使用相同batch。因此,打印/显示两个batch的输入和目标输出,并确保它们是正确的。
2. 尝试随机的输入
尝试传递随机数而不是实际数据,看看错误的现象是否相同。如果是的话,这是一个确定的信号,表明你的网络在某个时候正在把数据变成垃圾。试着一层一层地调试看看哪里出错了。
3. 检查你的数据加载
你的数据可能没有问题,但是将输入传递到网络的代码可能会有问题。在任何操作之前打印第一层的输入并检查它。
4. 确保输入连接到了输出
检查一些输入样本的标签是否正确。还要确保对输入样本的变换对输出标签的作用是相同的。
5. 输入和输出之间的关系是不是太随机了?
也许输入和输出之间关系的非随机部分与随机部分相比太小了(有人可能会说股票价格是这样的)。也就是说,输入与输出的关系并不充分。由于这取决于数据的性质,因此没有一种通用的方法来检测这一点。
6. 数据集中是否有太多的噪声?
有一次,当我从一个食品网站上抓取图像数据集时,这种情况发生在我身上。有太多不好的标签,网络无法学习。手动检查一些输入样本,看看标签是不是正确。
噪声的截止点有待讨论,因为本文在使用50%损坏标签的MNIST上获得了超过50%的准确性。
7. 打乱数据集
如果你的数据集没有被打乱,并且有一个特定的顺序(按标签排序),这可能会对学习产生负面的影响。打乱你的数据集,以避免这种情况。确保你在进行打乱的时候,是把输入和标签一起打乱的。
8. 减少类别的不均衡
每一个类别B的图像就有1000个类别A的图像?你可能需要平衡损失函数或尝试其他类别不平衡的方法。
9. 你有足够的训练样本吗?
如果你正在从头开始训练一个网络,你可能需要大量的数据。对于图像分类,人们说每个类需要1000个或更多的图像。
10. 确保你的batch里不只包含同一个标签
这可能发生在排过序的数据集中(即前10k个样本包含相同的类)。通过打乱数据集很容易修复。
11. 减少batch size
这篇文章指出大的batch size会降低模型的泛化能力。
附加1. 使用标准的数据集(如mnist, cifar10 )
在测试新网络架构或编写新代码时,首先使用标准数据集,而不是你自己的数据。这是因为这些数据集有很多参考结果,而且它们被证明是“可解的”。不会出现标签噪声、训练/测试分布差异、数据集难度过大等问题。
II. 数据归一化/增强