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

标签 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

此仓库包含数据集和代码。

最佳答案

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

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

说到“层”,通常是指称为多层感知器(MLP)的特定人工神经网络(ANN)体系结构,因此这是我将尝试解释的体系结构。

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

通常,然后,当您的网络行为不佳时,您必须更改1)数据集(因为大多数情况下,数据集设计不佳会导致行为不佳)或2)网络拓扑(即,使用除然后是MLP)。

对问题的理解是必不可少的,应通过输入“传递”给ANN。例如,如果您要制造指纹检测器,则知道图像可以旋转,因此,如果您应用了使图像对旋转不变的变换(例如,将图像坐标转换为极坐标表示),您将(通常)获得更好的效果。

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

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

现在,对于您的特定问题,有两个主要问题。

第一个与Error变量有关。您说它的价值很高,大约为12。那么,什么是12?这只是一个数字。通常,您应该计算Mean squared error来“估计”性能。另一方面,您所计算的是所有平方误差的总和。您应将值除以测试用例的数量(Error /= PatternCount;),并在加上平方误差时将其丢掉0.5。然后,您可以增加一些成功常量以使其停止之前(也许0.001很好,但是您必须对其进行调整)。

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

最后,如果您确实想使神经网络正常工作,则必须对已有的数据进行大量实验。最好是拥有一台高功率的PC而不是一台小型的arduino,然后重用其他人的工作(获取一些库)。我在大学工作时发现的最好方法是使用专门用于数值计算的工具(我使用了matlab,因为我们已经获得了许可证,但是可以使用八度音阶-开源-具有神经网络扩展)。这样,您可以轻松修改拓扑,数据集组成和学习参数。工作正常后,您可以提取参数并将其嵌入所需的内容(在C / C ++ / Java / python / whatever中进行临时实现)。

最好的祝福

PS有趣的是,我以评论开始,然后很快用完了空间...

关于c - 使用哪种类型的神经网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41217052/

相关文章:

c - 带有 clang 的多个源文件的 AST

c++ - 休眠功能但不阻止其他功能和代码

java - spark 数据集分组和求和

java - 将动态对象放入数据结构中

我可以使用指针打印出 int 数组的数组,就像字符串数组一样吗?

c - 菜单中的字母选项在 C 程序中声明为未声明

c - 如何检索枚举类型变量中的元素?

php - ESP8266 读取 JSON,但不读取 PHP 文件

swift - 将数据从 Arduino 发送到应用程序

c# - LINQ TO 数据集 : Multiple group by on a data table