【问题标题】:Prototyping neural networks原型神经网络
【发布时间】:2010-12-23 05:27:07
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 我推荐我的博客post,它介绍了如何使用 R 实现基本的神经网络并通过 GPU 加速。希望有帮助。

标签: neural-network prototyping


【解决方案1】:

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

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/

【讨论】:

    【解决方案2】:

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

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

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

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

    如果你有空的话,我建议

    1. 先使用高级语言甚至伪代码学习概念;
    2. 熟悉所有复杂性后,尤其是在使用不断发展的神经网络时,请选择他们已经熟悉的语言
    3. 那么您可能想开始研究如何针对速度、内存占用等进行优化。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我在 Matlab 中从头开始实现了常规的全连接和卷积网络,以便完全理解所有内容并创建原型工具。我发现保持一个良好的面向对象设计,其对象包含矢量化代码,然后前向评估和反向传播是相当好的,因为它只是矩阵乘法,Matlab 是optimised for
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          Scilab 是 Matlab 的开源替代品。

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

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

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

          【讨论】:

            【解决方案7】:

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

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

            http://www.heatonresearch.com/encog

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

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

                  【讨论】:

                    【解决方案11】:

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

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

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

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

                    【讨论】:

                      【解决方案12】:

                      您可能想给Weka 看看。它有一些用于数据可视化之类的内置工具,并且已经存在多年了 (some screenshots)。

                      【讨论】:

                        【解决方案13】:

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

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

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

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

                        【讨论】:

                          【解决方案14】:

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

                          【讨论】:

                            【解决方案15】:

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

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

                            【讨论】:

                              【解决方案16】:

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

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

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

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

                              希望这会有所帮助!

                              【讨论】:

                                【解决方案17】:

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

                                希望这会有所帮助。

                                【讨论】:

                                  【解决方案18】:

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

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

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

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2014-10-01
                                    • 2017-02-19
                                    • 2014-01-15
                                    • 1970-01-01
                                    • 2017-01-28
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多