使用什么类型的神经网络?

时间:2016-12-19 06:42:19

标签: c arduino dataset neural-network xor

我在Arduino上使用这个XOR example来训练一个2输入1输出数据集。我的数据集包含大约30,000个值。我使用4个值而不是XOR表,测试时得到了很好的结果。

我想用更多数据训练它。由于RAM的限制,我无法在Arduino上做到这一点。我用C语言重新编写代码,然后在笔记本电脑中训练它。我已经提供了20,000个值作为训练数据集,训练需要大约2天,而且输出非常糟糕。我把隐藏的神经元改为4,结果仍然非常糟糕。我的意思是我得到了12左右的最终误差。他们在给定的XOR示例中计算误差的方法是将所有误差相加,所以当我给出20,000个输入时,总和足够大。

我有更好的方法吗?我应该增加层数还是隐藏神经元?我可以使用30,000个值来匹配数据集的最佳方法是什么?

修改

我在Github上分享了代码:Repo

此repo包含数据集和代码。

2 个答案:

答案 0 :(得分:1)

您发布了类似这样的问题意味着您没有充分了解神经网络(或者您在此领域没有足够的经验)。这不是批评,这是非常普遍的,因为这是一个非常复杂的领域。

您问题的解决方案在很大程度上取决于您的问题和数据集。

说到“层”通常是指一种叫做多层感知器(MLP)的特定人工神经网络(ANN)架构,所以这是我试图解释的架构。

通常增加隐藏图层的数量并不会给你带来更好的表现,只是训练速度较慢。有时使用两个隐藏的感知层(因此三层,一个输出和两个隐藏,因为输入层不是由感知器组成)可以帮助解决特别复杂的分类问题,但我从未见过一个好的3层人工神经网络。 / p>

通常情况下,当您的网络行为不佳时,您必须更改1)数据集(因为大多数情况下,导致行为不良的数据集设计不佳)或2)网络拓扑(即使用其他ANN)除了MLP之外的建筑。)

对问题的理解至关重要,应通过输入“传递”到ANN。例如,如果您正在制作指纹探测器,您知道图像可以旋转,因此如果您应用使图像对旋转不变的变换(例如,您将图像坐标转换为极坐标表示),您将(通常) )获得更好的表现。

请记住,最重要的一步是选择数据集。你必须避免使用太少的数据,但是太多的数据也不是一个好的选择。这是一个称为overfitting的问题。网络将训练仅识别您传递给它的数据,并且无法找到您传递的“类似”数据。此外,数据集必须是平衡的:如果你想训练一个网络识别所有的狗,然后传递它只是beagles图像,它将无法识别杜宾犬。

这些都是通用建议。并注意我使用的“通常”副词。

现在,针对您的具体问题,有两个主要问题。

第一个与Error变量相关。你说它有很高的价值,大约12岁。嗯,什么是12?这只是一个数字。通常你应该计算Mean squared error以“估计”表演。另一方面,你计算的是所有平方误差的总和。您应该将值除以测试用例的数量(Error /= PatternCount;),并在添加平方误差时丢弃该值。然后你可以增加一点成功常数让它在之前停止(可能是0.001很好,但你必须调整它)。

而且......你的操作方式不正确。通常,您应该将数据集分为两部分:训练数据(通常约为80%)和随机选择的测试数据(通常约为20%)。您使用训练数据训练ann,然后当您拥有它时,您必须通过它传递测试数据并检测性能(因此您必须传递从未进入训练过程的数据)。通过这种方式,您将测试ANN概括的能力,而不是记住您已经过的点。

最后,如果你真的想让神经网络工作,你将不得不对你拥有的数据进行大量实验。最好是拥有高功率PC而不是小型arduino,并重新使用其他人的工作(获取一些库)。我在大学工作时发现的最佳方法是使用专门用于数值计算的工具(我使用了matlab,因为我们有许可证,但你可以使用octave - 开源 - 使用神经网络扩展)。这样,您可以轻松修改拓扑,数据集组成和学习参数。当你有一些工作时,你可以提取参数并将它们嵌入到你想要的东西中(在C / C ++ / Java / python /中进行临时实现)。

祝你好运

PS有趣的是,我把它作为评论开始,然后快速耗尽空间......

答案 1 :(得分:0)

没有最好的方法'因此,当谈到神经网络时 我建议你多做一些阅读,然后你可以尝试一下对你有用的东西 (亲自建议http://neuralnetworksanddeeplearning.com/

如果没有代码/数据集,很难提出任何建议。

PS:查看SGD https://en.wikipedia.org/wiki/Stochastic_gradient_descent