原型神经网络

时间:2009-12-04 12:16:43

标签: neural-network prototyping

根据您的经验,这是实施人工神经网络原型的最有效方法吗?关于R(免费,但我没有使用它)或Matlab(不是免费的),很多炒作,另一种可能的选择是使用像C ++ / Java / C#这样的语言。问题主要针对试图测试某些神经网络架构或学习算法的人。

如果您选择使用与上述三种编程语言不同的编程语言,您能告诉我他们的名字和一些有关您选择的解释(除了:这是我所知道的唯一/最常用的语言)。

感谢。

18 个答案:

答案 0 :(得分:27)

由于神经网络被科学家大量使用,而不是程序员使用,因此选择一种针对科学家的编程语言,并为神经网络提供良好的库。

Python是一个合理的选择,因为它被科学家广泛使用。开始的两个发行版是

http://www.pythonxy.com/

http://code.enthought.com/

这些Python发行版包含许多附加模块,这些附加模块不在标准Python库中,但对于科学家所做的编程类型非常有用。搜索Python包索引会出现一些神经网络包,如果您只是在学习神经网络,那么这些包可能没问题。

http://pypi.python.org/pypi?:action=search&term=neural&submit=search

但是,如果您正在使用神经网络进行认真的工作,您将需要像快速神经网络库这样的东西。这带有Python绑定,因此您可以使用Python进行编程,使用各种Python模块进行图形化,可视化,数据操作等。但是,您的神经网络将使用来自FANN库的优化编译代码运行。两全其美。

换句话说,对于运行实际的神经网络代码,您需要C而不是Java。由于C库没有与Java很好地集成,因此选择一种与C库平滑集成的语言。 Python可以做到这一点,并且比Java更有效率,因为解释算法所需的代码行要少得多。有些人发现Java的生产力提高了10倍。

你提到R,也许是因为它有你需要使用的统计功能,或者你可能有人可以编写R代码。同样,选择Python与R不是一个或两个决定。你可以使用两者。

RPY库允许Python程序访问R库和代码。使用它你可以用Python编写主程序,并将R视为提供库的工具,就像使用用C语言编写的FANN库一样。

http://rpy.sourceforge.net/

另一个名为RSPython的模块可以双向工作,因此R程序可以访问用Python编写的库。如果您有专业的R程序员帮助您,这将非常有用。

http://www.omegahat.org/RSPython/

并非全部。您可以利用Python来简化Java编程。如果您有Java神经网络引擎,您仍然可以使用在Java VM上运行的Jython版本在Python中编写大部分程序,并允许您在代码中使用任何Java库和类。您仍然可以使用快速FANN库,因为它们为Java程序提供绑定。

我推荐Python用于你的工作的主要原因是它被很多科学家使用,这就是为什么有两种科学导向的分布可用。第二个原因是Python非常容易让新手程序员开始使用,并且在探索神经网络时,您可能会从更简单的模拟开始,并通过更多数据操作和结果分析来处理更复杂的模拟。 Python将允许您构建自己的代码库,并成为专业的Python程序员,以便您可以将更多的注意力集中在神经网络问题上。如果你用一点Java,一点C ++和一点R来反弹,那么你将能够在神经网络上花费更少的时间。对于那些想要从事编程工作的人来说,这种策略可能会有所帮助,但对于想要通过神经网络获得一些重要成果的人来说却不是这样。

即使你的神经网络工作扩展到专门的硬件,即所谓的神经形态芯片,你仍然可以利用Python,因为NIH的这篇论文证明了:

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2701676/

答案 1 :(得分:9)

我尝试使用更高抽象级别的语言(matlab,java)和更低抽象级别的语言(C)。两者都使用工具箱和库,并自己编码。整体反应?两者都不是完美的工具。请记住:

  • 原型可能还不够:通常需要在大样本上运行网络,或者在样本子集上运行几次(在进化神经网络的情况下)以获得不错的结果。如果你必须运行一百万次网络,即使是小的性能提升也可能是一个巨大的帮助和节省时间(即C over matlab);

  • 另一方面,如果您需要易于编码,则可能需要使用众多预先打包的库中的一个(javaNN等);

  • 你在使用什么样的神经网络?连续时间重复神经网络(CTRNN)? Backprop?你是如何训练他们的?你如何验证他们的结果?准确性很重要吗? (即你是在小型设备上运行它们,例如像Arduinos这样的内存有限的机器人控制板吗?)

如果你有空闲时间,我建议

  1. 首先使用更高级别的语言学习概念,甚至是伪代码;
  2. 一旦熟悉了所有错综复杂的内容,特别是如果使用不断发展的神经网络,请选择他们已经熟悉的语言
  3. 然后你可能想开始研究如何优化速度,内存占用等。
  4. 希望这有帮助。

答案 2 :(得分:8)

我在某种程度上使用了Matlab的神经网络工具箱,并将其作为原型工具享受,因为它的图形界面允许您设置网络,试验大小的训练与测试输入数据,以及其后所有内置的训练测试。开始使用它似乎很自然......

我还尝试了Joone(Java面向对象的神经引擎)。 它设置得相当不错,当时我还是一个业余爱好者,并且通过测试仍然没有问题让各种网络正常运行。 它是Java,因此如果您正在训练大型复杂系统,它可能没有您可能想要的性能,但它的API非常平易近人。

我还看到在C ++中使用Flood完成了一些工作。它有一堆用适合解决一系列问题的网络设置的类。值得一试。

答案 3 :(得分:6)

我也强烈推荐python。对于原型,python是一个很好的选择:编程更容易,更快,有大量的库可用,并且它在科学界广泛使用。

另外,如果您正在使用python,您还可以利用优秀的PyBrain包,其中包含用于神经网络,强化学习,无监督学习和其他机器学习任务的算法,这些应该可以帮助您构建原型很快。

答案 4 :(得分:5)

这取决于您当前的设置。当我以前在大学时代回来工作时,我不得不使用C ++ + MPI +数字配方。这样做是因为我必须在大型beowulf集群上加载共享。

如果您的计算需求不大,那么任何事情都会发生。预包装的库可用于所有平台(R,Python(numPy,scipy),C / C ++(数字配方)等)。如果您对其中任何一个编程感到满意,那应该不是什么大问题。

如果我现在必须做任何原型,我可能会选择Python(因为我发现它更容易进行原型设计)

答案 5 :(得分:3)

Scilab是Matlab的开源替代品。

您可以使用ANN Toolbox for Scilab来试验神经网络。

专注于理论和实验。您是否为样品选择了判别特征?你的训练和测试集的状态是什么。对于每个实验,研究混淆矩阵。您是否知道为什么样本被错误分类?你觉得合乎逻辑吗?如果没有,你不使用哪个功能会有帮助?

接下来实施,使用您熟悉的语言。像Java或C#这样的托管语言可能不易出错:至少你因为指针或内存分配错误而不太可能搞砸了。优化是最后的(经过一些不错的分析)。

答案 6 :(得分:3)

“Encog是一个先进的神经网络和机器学习框架.Encog包含用于创建各种网络的类,以及支持类来规范化和处理这些神经网络的数据.Encog训练使用多线程弹性传播.Enog can还利用GPU来进一步缩短处理时间。还提供了基于GUI的工作台来帮助建模和训练神经网络.Encog自2008年以来一直在积极开发。“

Encog适用于Java,C#.Net和Silverlight。

http://www.heatonresearch.com/encog

答案 7 :(得分:2)

在我在学校的nn课程中,我们使用了matlab,然后我用java作为我的论文。

我建议使用java或matlab。 Matlab因为它可能已经有很多你可能需要的了。而java因为它可以快速实现开源项目中可能缺少的东西。除此之外,除了实现神经网络之外,您可能还需要一些方法来对它们进行可视化。为此,我个人认为java或matlab非常简单。

答案 8 :(得分:2)

我喜欢flood。它是免费的,全面的,用C ++编写。

答案 9 :(得分:2)

Matlab中的实现非常复杂和完整。我发现它足以评估不同类型的网络。它也可以使用外部接口进行编程。

然而,由于算法的实现不是开源的,当你需要将一段特定的代码移动到Matlab之外的应用程序中时,有时会更加困难,因为我的不同神经网络类型的手动编码实现产生了不同的结果

答案 10 :(得分:2)

我已经开始使用C ++编写NN实现,发现我对开头所涉及的数学知之甚少。最后的结果是,当我调整计算模型时,重构代码太难了。

最终我给了MATLAB,因为它绝对是学习神经网络如何工作的更好伴侣。我能够使用几个关键笔划对算法进行大量更改,并对结果进行绘图。

如果我使用已经构建的矩阵计算框架,也许我的经验会更好。考虑到你是如何做3D的,对于大多数语言应该有一些真正优化的库。你可能会考虑使用Direct3D或OpenGL,但我相信有更适合神经网络的东西。

我想我没有提供有关你应该做什么的很多信息。然而,我可以告诉你不应该做什么 - 那就是你自己编写矩阵操作代码。

答案 11 :(得分:2)

您可能希望了解Weka。它有一些内置的工具,用于数据可视化等方面,它已存在多年(some screenshots)。

答案 12 :(得分:2)

在我看来,在使用神经网络时,关键是让训练集正确,而不是如何在代码中实现网络本身。我会根据您尝试使用网络解决的问题类型选择一种语言。对于网络本身来说,c ++,c#,python和java都是可行的。

您是否在处理需要图像处理的问题时使用此功能?在这种情况下,您可能需要一些可以轻松连接到OpenCV等图像处理库的东西。或者是否涉及一些音频处理?

您可能需要轻松查看训练集,以便选择语言有多容易?您可以直接使用OpenGL或DirectX库,也可以使用某种包装器?对于DirectX,选择是C ++和C#。更高级别的抽象是否会说使用WPF工作?

我使用过C#是因为我对它很熟悉,可以利用.net中的众多数据处理技术,并使用wpf进行任何可视化处理。

答案 13 :(得分:2)

您可能还想尝试Nen - 它是免费的,easy to use并且非常轻量级。对于许多流行的回归和分类数据集,它也是outperforms LIBSVM in an out-of-the-box-comparison

答案 14 :(得分:1)

使用C ++,如果您的神经网络足够简单,请不要使用奇怪的框架。

也许5年前,我使用强化学习做了推箱子解算器。当时我们决定使用Java并使用意大利大学开发的代理框架。

这里的第一个错误决定是使用此框架。它基本上存在错误,这导致我们浪费大量时间来调试框架的代码。

一旦我们达到了一切稳定的程度,训练神经网络的速度就慢了。我们让它在一台非常强大的机器上一夜之间运行,但它仍然解决了很少的难题。基本上,Java对象分配和垃圾收集严重损害了系统的整体性能。我们通过创建对象池来调整应用程序,而不是一直分配它们,但程序的性能仍然比使用套接字直接在C ++中实现的类似赋值少一个数量级。

希望这有帮助!

答案 15 :(得分:1)

通常,当我修补这些算法时,我发现使用开源Weka Toolkit是一种很好的方法来原型化并发现一大堆不同的学习算法(不仅仅是人工神经网络)。现在,它看起来好像是来自一堆不同语言的绑定,所以如果你想在代码级别与Weka交互,你就不应该与Java绑定。

一旦我发现并理解了很酷的事情/做了很好的分类工作,我用C或C ++编写的算法部分是为了好玩,部分是为了获得使用更大数据集所需的必要速度增益。

答案 16 :(得分:1)

好吧,如果你想快速原型,那么python或matlab似乎是最好的。有很多库可用于神经网络。一些库的设计方式使得它们给你最小的调整范围,但像Theano这样的库非常快,因为函数在C内部编译(我想最快的日期)并且它提供了内部的全部功能调整。 Theano是最初使用的典型,但非常强大。后来如果你想从神经到深层神经,那么就没有什么区别了。专业Kagglers也倾向于使用这个库。该库还具有GPU支持。在我使用的所有库中,我发现theano是最有用和最强大的。像Caffe这样的深度学习的其他一些最先进的框架是在theano上开发的。

希望这有帮助。

答案 17 :(得分:0)

我用Java和C / C ++实现了几个神经网络原型。当性能很重要时,请使用C / C ++。

我的一个基本多层感知器的实现(未矢量化)在不到一分钟的时间内完成了一百万次训练迭代(设置了2个输入,4个隐藏和1个输出节点)。我几乎完全相同的Java实现需要花费大量时间来完成这项工作。 您还可以使用像Eigen这样的线性代数库来创建矢量化版本,以提高处理速度。

想象一下,您可以将其用于任何类型的图像处理(面部识别,OCR等),例如,使用28x28像素图像。您将拥有784个输入单元,并且至少有多少个隐藏单元。这需要花费大量的时间进行训练,因此节省宝贵的分钟,数小时或数天都是有益的。