0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于训练神经网络的37个小建议!

电子工程师 来源: AI公园 作者:Slav Ivanov ronghuai 2021-04-08 09:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

这个网络在过去12个小时中一直在进行训练。一切看起来都很好:梯度在流动,损失在降低。但是接下来的预测结果是:所有都是0,所有都是背景,没有检测到任何东西。“我做错了什么?”—我问我的电脑,电脑没睬我。

你从哪里开始检查你的模型是否正在输出垃圾(例如预测所有输出的平均值,或者它的准确性非常差)?

由于一些原因,网络可能不会进行训练。在许多调试的过程中,我经常发现自己在执行相同的检查。我把我的经验和最好的想法整理在这个方便的列表里。我希望它们对你也有用。

如何使用这个指南?

很多事情都可能出错。但其中一些更有可能出现问题。我通常以这张简短的清单作为紧急第一反应:

从一个已知对这类数据有效的简单模型开始(例如,图像的VGG)。如果可能的话,使用标准的损失。关闭所有花哨的功能,例如正则化和数据扩充。如果对模型进行finetune,请仔细检查预处理,因为预处理应该与原始模型的训练相同。验证输入数据是否正确。

从一个很小的数据集(2-20个样本)开始。对其进行过拟合,并逐渐添加更多数据。

开始逐步添加所有遗漏的部分:增强/正则化,自定义损失函数,尝试更复杂的模型。

如果上面的步骤没有什么用,那么就从下面的列表开始,逐一验证。

一 . 数据集的问题

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 . 数据归一化/增强

12. 特征标准化

你是否标准化了你的输入使其均值和单位方差为零?

13. 你是不是用了太多的数据增强?

增强具有规律性的效果。太多的这些与其他形式的正则化(权值的L2,dropout等等)结合在一起会导致网络欠拟合。

14. 检查你的预训练模型的预处理

如果你使用的是预训练模型,请确保你使用的归一化和预处理与训练时的模型相同。例如,图像像素应该在[0,1]、[- 1,1]还是[0,255]范围内?

15. 检查训练/验证/测试集的预处理

CS231n指出了一个常见的陷阱:

“……任何预处理统计数据(例如数据平均值)必须仅对训练数据进行计算,然后应用于验证/测试数据。” 例如,计算平均值并从整个数据集中的每幅图像中减去它,然后将数据分割为train/val/test分割是错误的。"

同时,检查每个样本或batch的预处理的不同之处。

III . 实现中的问题

16.尝试解决这个问题的更简单的版本的问题

这将有助于找到问题所在。例如,如果目标输出是物体的类别和坐标,请尝试只预测物体的类别。

17.看看“随机”时候的正确的损失

再次来自优秀的CS231n:使用小参数进行初始化,没有正则化。例如,如果我们有10个类,在随机的情况下意味着我们将有10%的时候会得到正确的类,Softmax损失是正确类的概率的负对数,因此:-ln(0.1) = 2.302.

在此之后,试着增加正则化强度,这会增加损失。

18. 检查你的损失函数

如果你实现了自己的loss函数,那么检查它的bug并添加单元测试。通常,我自己写的损失可能是不正确的,并以一种微妙的方式损害了网络的性能。

19. 验证损失的输入

如果你使用的是框架提供的loss函数,请确保你传递给它的是它所期望的。例如,在PyTorch中,我会混淆NLLLoss和CrossEntropyLoss,因为前者需要softmax输入,而后者不需要。

20. 调整损失的权重

如果你的损失由几个较小的损失函数组成,请确保它们相对于每个损失函数的大小是正确的。这可能涉及测试不同的损失权重组合。

21. 使用其他的度量方法进行监控

有时候,损失并不能很好地预测你的网络是否训练的好。如果可以,使用其他指标,如准确性。

22. 测试所有的自定义的层

你自己实现了网络中的一些层吗?反复检查以确保它们按照预期工作。

23. 检查“冻结”的层和变量

检查你是否无意中禁用了一些层/变量的梯度的更新。

24. 增加网络的大小

也许你的网络的表达能力不足以得到目标函数。尝试在全连接的层中添加更多的层或更多的隐藏单元。

25. 检查隐藏维度的错误

如果你的输入看起来像(k, H, W) =(64, 64, 64)那么很容易忽略与错误维度相关的错误。对输入维度使用奇怪的数字(例如,每个维度使用不同的素数),并检查它们如何在网络中传播。

26. 梯度检查

如果你手动实现梯度下降,检查梯度,确保你的反向传播工作正常。

IV. 训练问题

27. 处理小数据集

过拟合数据的一个子集,并确保它能工作。例如,用一两个样本来训练,看看你的网络是否能学会区分它们。再继续使用每个类的更多样本。

28. 检查权值初始化

如果不确定的话,使用Xavier或He初始化。另外,初始化可能会导致错误的局部最小值,所以尝试不同的初始化,看看是否有帮助。

29. 改变你的超参数

也许你使用了一组特别糟糕的超参数。如果可行,尝试网格搜索。

30. 减少正则化

过多的正则化会导致网络严重欠拟合。减少正规化,如dropout、、权重/偏置L2正规化等。在优秀的“Practical Deep Learning for coders”课程中,Jeremy Howard建议首先摆脱欠拟合。这意味着你需要对训练数据进行充分的过拟合,然后再解决过拟合问题。

31. 多给点时间

也许你的网络需要更多的时间来训练,才能开始做出有意义的预测。如果你的损失在稳步减少,那就让它继续训练吧。

32. 从训练模式切换到测试模式

有些框架具有Batch Norm、drop等层,在训练和测试期间的行为有所不同。切换到适当的模式可能有助于你的网络进行正确的预测。

33. 训练可视化

监控每一层的激活值、权重和更新。确保它们大小匹配。例如,参数更新的大小(权重和偏差)应该是1-e3。

考虑一个可视化库,比如Tensorboard和Crayon。必要时,你还可以打印权重/偏置/激活值。

寻找平均值比0大得多的层激活。尝试 Batch Norm或ELUs。

Deeplearning4j指出在权重和偏差直方图中应该能看到:
对于权值,这些直方图在一段时间后应该有一个近似的高斯分布。 对于偏置,这些直方图通常从0开始,通常以近似高斯分布结束(LSTM是一个例外)。 注意那些发散到+/-∞的参数。留意那些变得很大的偏置。 如果类的分布非常不平衡,这种情况有时会发生在分类的输出层。

检查层的更新,他们应该是一个高斯分布。

34. 尝试不同的优化器

你选择的优化器不应该会导致你的网络不训练,除非你选择了特别糟糕的超参数。然而,对于一个任务,适当的优化器可以帮助在最短的时间内获得最多的训练。你正在使用的算法的论文中应该会指定优化器。如果不是,我倾向于使用Adam或使用动量的SGD。

查看Sebastian Ruder的excellent post了解更多关于梯度下降优化器的信息。

35. 梯度爆炸/消失

检查层的更新,因为很大的值可以导致梯度爆炸。梯度剪裁可能会有所帮助。

检查层的激活。来自Deeplearning4j的是一条很好的指导方针:“一个好的激活值的标准差在0.5到2.0之间。显着地超出这个范围可能意味着激活值的消失或爆炸”

36. 增大/降低学习率

较低的学习率会导致模型非常缓慢地收敛。

高学习率将在开始时迅速减少损失,但可能很难找到一个好的解决方案。

把你当前的学习速度乘以0.1或10。

37. 克服NaNs

在训练RNN时,获得NaN (Non-a-Number)是一个更大的问题。一些解决方法:

降低学习速率,特别是在前100次迭代中获得NaNs时。

NaNs可以由除以0或ln(0)或负数得到。

Russell Stewart有很多关于如何处理NaNs的建议()。

尝试逐层评估你的网络,并查看NaNs出现在哪里。

英文原文:https://blog.slavv.com/37-reasons-why-your-neural-network-is-not-working...

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4844

    浏览量

    108227
  • AI
    AI
    +关注

    关注

    91

    文章

    41479

    浏览量

    302801
  • rnn
    rnn
    +关注

    关注

    0

    文章

    92

    浏览量

    7375
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么 VisionFive V1 板上的 JH7100 中并存 NVDLA 引擎和神经网络引擎?

    我想知道为什么 VisionFive V1 板上的 JH7100 中并存 NVDLA 引擎和神经网络引擎,请问?您能否举一些关于他们的用例的例子?
    发表于 03-25 06:01

    神经网络的初步认识

    日常生活中的智能应用都离不开深度学习,而深度学习则依赖于神经网络的实现。什么是神经网络神经网络的核心思想是模仿生物神经系统的结构,特别是大脑中神经
    的头像 发表于 12-17 15:05 494次阅读
    <b class='flag-5'>神经网络</b>的初步认识

    自动驾驶中常提的卷积神经网络啥?

    在自动驾驶领域,经常会听到卷积神经网络技术。卷积神经网络,简称为CNN,是一种专门用来处理网格状数据(比如图像)的深度学习模型。CNN在图像处理中尤其常见,因为图像本身就可以看作是由像素排列成的二维网格。
    的头像 发表于 11-19 18:15 2287次阅读
    自动驾驶中常提的卷积<b class='flag-5'>神经网络</b>是<b class='flag-5'>个</b>啥?

    NMSIS神经网络库使用介绍

    (q7_t) 和 16 位整数 (q15_t)。 卷积神经网络示例: 本示例中使用的 CNN 基于来自 Caffe 的 CIFAR-10 示例。神经网络由 3 卷积层组成,中间散布着 ReLU
    发表于 10-29 06:08

    构建CNN网络模型并优化的一般化建议

    通过实践,本文总结了构建CNN网络模型并优化的一般化建议,这些建议将会在构建高准确率轻量级CNN神经网络模型方面提供帮助。 1)避免单层神经网络
    发表于 10-28 08:02

    如何将训练好的神经网络模型部署到蜂鸟e203开发板上

    本帖欲分享如何将训练好的神经网络模型部署到蜂鸟e203开发板上。 1. 加载TFLite模型 std::unique_ptr interpreter(new tflite::Interpreter
    发表于 10-22 08:04

    在Ubuntu20.04系统中训练神经网络模型的一些经验

    本帖欲分享在Ubuntu20.04系统中训练神经网络模型的一些经验。我们采用jupyter notebook作为开发IDE,以TensorFlow2为训练框架,目标是训练
    发表于 10-22 07:03

    CICC2033神经网络部署相关操作

    在完成神经网络量化后,需要将神经网络部署到硬件加速器上。首先需要将所有权重数据以及输入数据导入到存储器内。 在仿真环境下,可将其存于一文件,并在 Verilog 代码中通过 readmemh 函数
    发表于 10-20 08:00

    液态神经网络(LNN):时间连续性与动态适应性的神经网络

    1.算法简介液态神经网络(LiquidNeuralNetworks,LNN)是一种新型的神经网络架构,其设计理念借鉴自生物神经系统,特别是秀丽隐杆线虫的神经结构,尽管这种微生物的
    的头像 发表于 09-28 10:03 1609次阅读
    液态<b class='flag-5'>神经网络</b>(LNN):时间连续性与动态适应性的<b class='flag-5'>神经网络</b>

    神经网络的并行计算与加速技术

    随着人工智能技术的飞速发展,神经网络在众多领域展现出了巨大的潜力和广泛的应用前景。然而,神经网络模型的复杂度和规模也在不断增加,这使得传统的串行计算方式面临着巨大的挑战,如计算速度慢、训练时间长等
    的头像 发表于 09-17 13:31 1342次阅读
    <b class='flag-5'>神经网络</b>的并行计算与加速技术

    基于神经网络的数字预失真模型解决方案

    在基于神经网络的数字预失真(DPD)模型中,使用不同的激活函数对整个系统性能和能效有何影响?
    的头像 发表于 08-29 14:01 3706次阅读

    无刷电机小波神经网络转子位置检测方法的研究

    摘要:论文通过对无刷电机数学模型的推导,得出转角:与三相相电压之间存在映射关系,因此构建了一以三相相电压为输人,转角为输出的小波神经网络来实现转角预测,并采用改进遗传算法来训练网络
    发表于 06-25 13:06

    神经网络专家系统在电机故障诊断中的应用

    摘要:针对传统专家系统不能进行自学习、自适应的问题,本文提出了基于种经网络专家系统的并步电机故障诊断方法。本文将小波神经网络和专家系统相结合,充分发挥了二者故障诊断的优点,很大程度上降低了对电机
    发表于 06-16 22:09

    神经网络RAS在异步电机转速估计中的仿真研究

    众多方法中,由于其结构简单,稳定性好广泛受到人们的重视,且已被用于产品开发。但是MRAS仍存在在低速区速度估计精度下降和对电动机参数变化非常敏感的问题。本文利用神经网络的特点,使估计更为简单、快速
    发表于 06-16 21:54

    基于FPGA搭建神经网络的步骤解析

    本文的目的是在一神经网络已经通过python或者MATLAB训练好的神经网络模型,将训练好的模型的权重和偏置文件以TXT文件格式导出,然后
    的头像 发表于 06-03 15:51 1555次阅读
    基于FPGA搭建<b class='flag-5'>神经网络</b>的步骤解析