23

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

如果您选择使用与上述三种不同的编程语言,您能否告诉我它们的名称以及有关您选择的一些解释(例外:这是我所知道的唯一/最常用的语言)。

谢谢。

4

18 回答 18

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 库一样。

https://rpy2.github.io/

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

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

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

我为您的工作推荐 Python 的主要原因是它被大量科学家使用,这就是为什么有两个面向科学的发行版可用。第二个原因是 Python 对新手程序员来说很容易上手,在探索神经网络时,您可能会从更简单的模拟开始,然后通过更多的数据处理和结果分析来处理更复杂的模拟。Python 将允许你建立自己的代码库,成为一名专家级的 Python 程序员,这样你就可以将更多的注意力集中在神经网络问题上。如果您使用一点 Java、一点 C++ 和一点 R,那么您将能够在神经网络上花费更少的时间。这种策略可能对想要从事编程职业的人有好处,

即使您的神经网络工作扩展到专门的硬件,即所谓的神经形态芯片,您仍然可以利用 Python,正如 NIH 的这篇论文所展示的那样:

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

于 2009-12-09T22:28:07.230 回答
9

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

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

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

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

如果你有空的话,我建议

  1. 使用高级语言学习概念,甚至先使用伪代码;
  2. 一旦你熟悉了所有的复杂性,特别是如果使用不断发展的神经网络,选择他们已经熟悉的语言
  3. 那么您可能想开始研究如何优化速度、内存占用等。

希望这可以帮助。

于 2009-12-09T09:08:25.490 回答
8

我在一定程度上使用了 Matlab 的神经网络工具箱,并且喜欢它作为原型设计工具,因为它的图形界面允许您设置网络,试验训练与测试输入数据的大小,以及训练后测试所有内置。开始使用它看起来很自然......

我还尝试了Joone(Java Object Oriented Neural Engine)。它设置得非常好,当时我还是个业余爱好者,但在启动和运行各种网络并进行测试时仍然没有问题。它是 Java,因此如果您正在训练大型复杂系统,它可能没有您可能想要的性能,但它的 API 非常平易近人。

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

于 2009-12-06T13:48:20.270 回答
6

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

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

于 2009-12-11T23:06:35.253 回答
5

这取决于您当前的设置。当我以前在大学时代研究它们时,我不得不使用 C++ + MPI + 数字食谱。这样做是因为我必须在大型 beowulf 集群上加载共享。

如果您的计算需求不大,任何事情都可以。预打包的库可在所有平台上使用(R、Python(numPy、scipy)、C/C++(Numerical recipes)等)。如果您对其中任何一个编程感到满意,那应该没什么大不了的。

如果我现在必须对任何东西进行原型设计,我可能会使用 Python(只是因为我发现它更容易进行原型设计)

于 2009-12-10T21:10:20.793 回答
3

Scilab是 Matlab 的开源替代品。

您可以使用Scilab 的 ANN 工具箱来试验神经网络。

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

接下来是实施,使用您熟悉的语言。像 Java 或 C# 这样的托管语言可能不太容易出错:至少你不太可能因为指针或内存分配错误而搞砸事情。优化排在最后(在像往常一样进行一些体面的分析之后)。

于 2009-12-10T09:48:07.180 回答
3

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

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

http://www.heatonresearch.com/encog

于 2011-01-14T17:22:31.843 回答
2

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

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

于 2009-12-11T15:37:37.180 回答
2

我喜欢洪水。它是免费的、全面的,并且是用 C++ 编写的。

于 2009-12-11T16:44:02.307 回答
2

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

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

于 2009-12-12T05:09:26.870 回答
2

我已经开始使用 C++ 编写 NN 实现,但发现我对一开始所涉及的数学了解不够。最终发生的是,在我调整计算模型时重构代码太难了。

最终我放弃了 MATLAB,因为它绝对是学习神经网络工作原理的更好伴侣。我能够使用几个按键对算法进行巨大的更改,并将结果绘制成图表。

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

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

于 2009-12-12T05:32:16.293 回答
2

你可能想看看Weka。它有一些用于数据可视化之类的内置工具,并且已经存在多年(一些屏幕截图)。

于 2009-12-12T09:33:57.187 回答
2

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

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

您可能需要轻松地可视化训练集,那么使用选择的语言有多容易?您可以直接使用 OpenGL 或 DirectX 库还是使用某种包装器?对于 DirectX,选择是 C++ 和 C#。更高层次的抽象会说使用 WPF 工作吗?

我使用 C# 是因为我熟悉它,并且可以利用 .net 中的众多数据处理技术,并将 wpf 用于所需的任何可视化。

于 2009-12-12T10:10:31.507 回答
2

您可能还想尝试一下Nen - 它免费、易于使用且非常轻量级。它在许多流行的回归和分类数据集上的开箱即用比较中也优于 LIBSVM。

于 2012-02-28T09:45:49.577 回答
1

通常,当我修改这些算法时,我发现使用开源Weka Toolkit是一种很好的方法来制作原型并发现一大堆不同的学习算法(不仅仅是人工神经网络)。如今,它们看起来好像绑定了来自多种不同语言的绑定,因此如果您想在代码级别与 Weka 交互,则不应将其绑定到 Java。

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

于 2009-12-09T22:45:08.740 回答
1

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

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

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

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

希望这可以帮助!

于 2009-12-10T14:08:45.087 回答
1

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

希望这可以帮助。

于 2015-03-19T04:38:05.863 回答
0

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

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

想象一下,您会将您的图像用于任何类型的图像处理(人脸识别、OCR 等),例如 28x28 像素图像。您将拥有 784 个输入单元和至少同样多的隐藏单元。这需要大量的时间来训练,因此节省宝贵的几分钟、几小时或几天是有益的。

于 2016-05-30T17:28:11.890 回答