Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用哪种类型的神经网络?_C_Arduino_Dataset_Neural Network_Xor - Fatal编程技术网

C 使用哪种类型的神经网络?

C 使用哪种类型的神经网络?,c,arduino,dataset,neural-network,xor,C,Arduino,Dataset,Neural Network,Xor,我在Arduino上使用它来训练一个2输入1输出的数据集。我拥有的数据集包含大约30000个值。我使用了4个值而不是XOR表,测试时得到了很好的结果 我想用更多的数据来训练它。由于其RAM限制,我无法在Arduino上执行此操作。我用C语言重新编写了代码,并在笔记本电脑上进行了训练。我给了20000个值作为训练数据集,训练大约花了2天,结果非常糟糕。我把隐藏的神经元改成了4个,结果还是很糟糕。我的意思是我在12点左右得到了最后一个错误。在给定的XOR示例中,他们计算错误的方法是将所有错误相加,所

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

我想用更多的数据来训练它。由于其RAM限制,我无法在Arduino上执行此操作。我用C语言重新编写了代码,并在笔记本电脑上进行了训练。我给了20000个值作为训练数据集,训练大约花了2天,结果非常糟糕。我把隐藏的神经元改成了4个,结果还是很糟糕。我的意思是我在12点左右得到了最后一个错误。在给定的XOR示例中,他们计算错误的方法是将所有错误相加,所以当我给出20000个输入时,总和就足够大了

有更好的办法吗?我应该增加层次或隐藏神经元的数量吗?我可以用什么方法来拟合具有30000个值的数据集

编辑:

我在Github上共享了代码:


此repo包含数据集和代码。

对于神经网络,没有这样的“最佳方法”。
我建议你多读一些书,然后你可以试试适合你的。
(个人建议)

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


PS:请查看SGD

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

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

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

通常,增加隐藏层的数量并不能带来更好的性能,只是训练速度较慢。有时使用两个隐藏的感知机层(三层,一个输出,两个隐藏,因为输入层不是由感知机组成)可以帮助解决特别复杂的分类问题,但我从未见过一个好的三层ANN

通常,当您的网络存在不良行为时,您必须更改1)数据集(因为大多数情况下,导致不良行为的是不良的数据集设计)或2)网络拓扑(即使用除MLP之外的其他ANN体系结构)

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

请记住,最重要的步骤是选择数据集。您必须避免数据太少,但数据太多也不是一个好的选择。这是一个众所周知的问题。网络将训练只识别您传递给它的数据,而无法找到您传递的“相似”数据。此外,数据集必须平衡:如果你想训练一个网络来识别所有的狗,然后只传递比格犬的图像,它将无法识别杜宾犬

这些都是一般性的建议。注意我用的“通常”副词

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

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

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

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

致意


PS有趣的是,我把它作为一个注释开始,然后很快就用完了空间…

我用C语言在Arduino中重新编写了相同的代码,所以代码就在那里。我如何显示数据集,比如一个图形就足够了吗?这显示了它是如何变化的。是否将其上载为csv?