10个最佳的人工智能开发框架和AI库
编辑推荐:本文主要讲解了10个人工智能开发框架和AI库分别是什么及优缺点。本文来自于云+社区,由火龙果软件Anna编辑、推荐。人工智能(AI)已经存在很长时间了。然而,由于这一领域的巨大进步,近年来它已成为一个流行语。人工智能曾经被称为一个完整的书呆子和天才的领域,但由于各种开发库和框架的发展,它已经成为一个友好的IT领域,并有很多人正走进它。
在这篇文章中,我们将研究用于人工智能的优质库,它们的优缺点以及它们的一些特征。让我们深入并探索这些人工智能库的世界!
1.TensorFlow
“使用数据流图表的可伸缩机器学习的计算”
语言:C++或Python。
当进入AI时,你会听到的第一个框架之一就是Google的TensorFlow。
TensorFlow是一个使用数据流图表进行数值计算的开源软件。这个框架被称为具有允许在任何CPU或GPU上进行计算的架构,无论是台式机、服务器还是移动设备。这个框架在Python编程语言中是可用的。
TensorFlow对称为节点的数据层进行排序,并根据所获得的任何信息做出决定。点击查看详情!
优点:
使用易于学习的语言(Python)。
使用计算图表抽象。
用于TensorBoard的可用性的可视化。
缺点:
这很慢,因为Python不是语言中最快的。
缺乏许多预先训练的模型。
不完全开源。
2.MicrosoftCNTK
“开源深度学习工具包”
语言:C++。
我们可以称之为微软对Google的TensorFlow的回应。
微软的计算网络工具包是一个增强分离计算网络模块化和维护的库,提供学习算法和模型描述。
在需要大量服务器进行操作的情况下,CNTK可以同时利用多台服务器。
据说它的功能与Google的TensorFlow相近;但是,它会更快。在这里了解更多。
优点:
这是非常灵活的。
允许分布式训练。
支持C++、C#、Java和Python。
缺点:
它以一种新的语言――网络描述语言(NetworkDescriptionLanguage,NDL)来实现。
缺乏可视化。
3.Theano
“数值计算库”
语言:Python。
Theano是TensorFlow的强有力竞争者,是一个功能强大的Python库,允许以高效率的方式进行涉及多维数组的数值操作。
Theano库透明地使用GPU来执行数据密集型计算而不是CPU,因此操作效率很高。
出于这个原因,Theano已经被用于为大规模的计算密集型操作提供动力大约十年。
然而,在2017年9月,宣布Theano的主要开发将于2017年11月发布的1.0版本后停止。
这并不意味着它是一个不够强大的库。你仍然可以随时进行深入的学习研究。在这里了解更多。
Theano
data-intensivecomputations
优点:
正确优化CPU和GPU。
有效的数字任务。
缺点:
与其他库相比,原生Theano有点低级。
需要与其他库一起使用以获得高度的抽象化。
AWS上有点bug。
4.Caffe
“快速、开源的深度学习框架”
语言:C++。
Caffe是一个强大的深度学习框架。
像这个清单上的其他框架一样,深度学习的研究速度非常快。
借助Caffe,您可以非常轻松地构建用于图像分类的卷积神经网络(CNN)。Caffe在GPU上运行良好,这有助于在运行期间提高速度。查看主页获取更多信息。
Caffe主要的类有:
mainclasses
优点:
Python和MATLAB的绑定可用。
性能表现良好。
无需编写代码即可进行模型的训练。
缺点:
对于经常性网络不太好。
新体系结构不太好。
5.Keras
“人类的深度学习”
语言:Python。
Keras是一个用Python编写的开源的神经网络库。
与TensorFlow、CNTK和Theano不同,Keras不是一个端到端的机器学习框架。
相反,它作为一个接口,提供了一个高层次的抽象化,这使得无论它坐落在哪个框架上,神经网络的配置都会变得容易。
谷歌的TensorFlow目前支持Keras作为后端,而微软的CNTK也会在很短的时间内做到这一点。在这里了解更多。
优点:
它是用户友好的。
它很容易扩展。
在CPU和GPU上无缝运行。
与Theano和TensorFlow无缝工作。
缺点:
不能有效地用作独立的框架。
6.Torch
“一个开源的机器学习库”
语言:C。
Torch是一个用于科学和数字操作的开源机器学习库。
这是一个基于Lua编程语言而非Python的库。
Torch通过提供大量的算法,使得深度学习研究更容易,并且提高了效率和速度。它有一个强大的N维数组,这有助于切片和索引等操作。它还提供了线性代数程序和神经网络模型。点击查看详情!
优点:
非常灵活。
高水平的速度和效率。
大量的预训练模型可用。
缺点:
不清楚的文献记录。
缺乏即时使用的即插即用代码。
它基于一种不那么流行的语言――Lua。
7.Accord.NET
“机器学习、计算机视觉、统计和.NET通用科学计算”
语言:C#。
这是专为C#程序员设计的。
Accord.NET框架是一个.NET机器学习框架,使音频和图像处理变得简单。
这个框架可以有效地处理数值优化、人工神经网络,甚至可视化。除此之外,Accord.NET对计算机视觉和信号处理的功能非常强大,同时也使得算法的实现变得简单。检查主页面。
优点:
它有一个强大而积极的开发团队。
非常有据可查的框架。
质量可视化。
缺点:
不是一个非常流行的框架。
比TensorFlow慢。
8.SparkMLlib
“可扩展的机器学习库”
语言:Scala。
Apache的SparkMLlib是一个非常可扩展的机器学习库。
它非常适用于诸如Java、Scala、Python,甚至R等语言。它非常高效,因为它可以与Python库和R库中的numpy进行互操作。
MLlib可以轻松插入到Hadoop工作流程中。它提供了机器学习算法,如分类、回归和聚类。
这个强大的库在处理大型数据时非常快速。
优点:
对于大规模数据处理非常快速。
提供多种语言。
缺点:
陡峭的学习曲线。
即插即用仅适用于Hadoop。
9.Sci-kitLearn
“用Python的机器学习”
语言:Python。
Sci-kitlearn是一个非常强大的机器学习Python库,主要用于构建模型。
使用numpy、SciPy和matplotlib等其他库构建,对统计建模技术(如分类、回归和聚类)非常有效。
Sci-kitlearn带有监督学习算法、无监督学习算法和交叉验证等功能。点击查看详情!
优点:
许多主要算法的可用性。
有效的数据挖掘。
缺点:
不是构建模型的最佳选择。
GPU效率不高。
10.MLPack
“可扩展的C++机器学习库”
语言:C++。
MLPack是一个用C++实现的可扩展的机器学习库。因为它是用C++编写的,所以你可以猜测它对于内存管理是非常好的。
MLPack以极高的速度运行,因为高质量的机器学习算法与库一起出现。这个库是对新手友好的,并提供了一个简单的API使用。点击查看详情!
优点:
非常可扩展。
Python和C++绑定可用。
缺点:
不是最好的文献记录。
通过人工智能编写自修改/自完善的程序
作者:KoryBecker
译者: Mr派
来源:http://www.primaryobjects.com/2013/01/27/using-artificial-intelligence-to-write-self-modifying-improving-programs/(点击阅读原文前往)
简介
计算机程序可以自己编程吗?人类程序员有朝一日能被他们掌握的计算机取代吗?就像农民、装配线工人和电话接线员一样,程序员会是下一个被取代的吗?虽然这种想法似乎有些牵强,但实际上可能还没我们想象的那么遥远。这篇文章描述了一个实验来制作一个人工智能程序,它使用自修正和自完善的遗传算法开发自己的程序.
“hello”
上面的程序代码是由一个人工智能程序创建的,该程序的设计目的是编写具有自我修改和自我改进代码的程序。该程序在29分钟内创建了上述内容。编程语言是脑力劳动。为什么使用这种编程语言呢?请继续阅读。
AI程序的所有代码都在GitHub(https://github.com/primaryobjects/AI-Programmer)上。
人工智能占据编码领域
随着计算机技术、硬件、内存和CPU速度的发展,人工智能多年来一直在稳步发展。随着计算机的速度越来越快,可以进行更多的计算,这使得许多人工智能算法所需要的计算密集型处理能力越来越强。
人工智能的爱好
这对我来说是一种兴趣,涉足人工智能程序,尝试编写一个程序,它本身可以编写程序。当然,我并不是指取得程序指令或代码块子集并将它们组合在一起或以其他方式进行优化以产生最终结果的程序,而是从头开始,人工智能完全不知道如何用目标语言编程。人工智能必须自己学习如何为特定的目的创建一个功能完整的程序。
我最初是在20世纪90年代末开始尝试创建程序,用简单的if/then/else语句来输出BASIC程序。由于种种原因,这是一项艰巨的任务。首先,使用if/then/else条件来编写一个随机程序似乎并不十分明智。第二,BASIC计算机指令的数量太大了。更麻烦的是,一些指令是十分危险的(Shell(“formatc:”))!我还尝试使用C、c++和其他一些语言生成程序。然而,这种幼稚的方法从未产生过一个可以工作的小程序。尽管这不仅仅是由于使用简单的if/then/else语句,还因为所选的编程语言是为了供人类使用而不是计算机,因此,人工智能的自动化要复杂得多。
虽然最终的目标是制作一个计算机程序,它能够编写自己的文字处理软件、图像编辑工具、web浏览器或磁盘碎片整理程序,但我更感兴趣的是一个简单的概念验证,要证明这个想法是可行的。
猴子和打字机
我最初的想法来自于“无限猴子定理”,如果你有1000多只猴子在打字机上不停地敲打,它们最终会重现莎士比亚的剧本。这听起来很荒谬,但只要有足够的时间,猴子们肯定会按“一些”随机的字符序列,最终生成书面作品。简化这个想法,其中一只猴子至少会在敲击键盘的时候打出莎士比亚戏剧的第一个字母;这当然是可能的。
如果你能引导猴子呢?每次一只猴子按正确的顺序按下正确的键,你就奖励他一个香蕉?过了足够长的时间,也许猴子会识别一个模式?如果他真的很敏锐,也许他甚至会开始选择哪些字母组合在一起形成英语单词,这样,他就会比他的同伴获得更多的香蕉。
转向遗传算法
这是遗传算法背后的基本思想。遗传算法是一种模拟生物进化的人工智能,它除了可用的工具和有效的指令,对某个问题一无所知。人工智能选择了一系列随机指令(作为DNA片段),并检查结果的适应度。它的规模很大,有100个程序。当然,有些程序比其他程序好。那些有最好的适应度的部分会联合起来产生后代。每代人都从进化技术中获得了一点额外的多样性,如轮盘选择、组合交叉和变异。这一过程在每个孩子的下一代中重复,希望能产生更好的结果,直到找到一个目标解决方案。遗传算法是适者生存的编程实现。考虑到它们是如何为一个特定的解决方案搜索一个巨大的问题空间的,它们也可以被归类为人工智能的搜索算法。
好吧,但是为什么是Brainf-ck?
虽然最初的实验使用BASIC、C、c++和其他语言,未能产生结果,但我通过将自产的编程语言(包括添加、减、循环等)与遗传算法和神经网络结合起来,成功地生成了AI程序。虽然这很有趣,但最终的结果只是简单的数学计算,而且编程语言本身,是未知的,并且有严重的局限性,不知道它最终会产生什么。
我开始寻找一种简单的编程语言,具有有限的指令,我可以训练人工智能程序来使用。和汇编(ASM)很接近,但仍然包含太多的排列。尽管听起来很可笑,但我最终还是尝试了brainf-ck,并最终成功地生成了上面所示的代码。
由于人类使用它很困难,brainf-ck被认为是一种笑话式的编程语言,它实际上对计算机有几个明显的优势。
Brainf-ck作为人工智能编程语言的优势
1.它是图灵完备的
图灵完全的编程语言意味着它理论上能够解决宇宙中的任何计算问题。使用此功能的编程语言提供了大量的可能性。毕竟,如果不是所有的计算机程序都被设计成执行某种计算并以某种方式输出结果,它也将完成大多数任务。
2.它由简化的8条指令组成
简化的指令集减少了找到目标程序代码的搜索空间。随着计算机越来越快,可以搜索更大的问题空间。然而,在个人电脑上,搜索空间需要被限制。通过将编程指令限制为8个不同的字符,人工智能可以运行得更快,并在合理的时间内(几分钟,几小时,甚至是一天)获得最佳的适应度
3. 构建解释器很容易
该指令集有良好的文档且易于理解。因此,创建一个可以执行程序的简单解释器非常简单。通过将解释器包含在AI程序和遗传算法中,代码可以优化运行,比调用外部编译器来执行每个子程序的速度要快得多。这也提供了安全约束,因为子程序运行在人工智能程序内的受控环境中。人工智能还可以访问解释器的内部组件,比如内存、指令和输出。这在计算适应分时很有用。然而,使用第三方编译器,这些组件很难访问。
4.每个指令是1个字节
本文中使用的人工智能程序是用c#、.NET设计的,使用一组double作为基因组。基因组中的每一个double(基因)都对应于编程语言中的一条指令。由于每个指令只有1个字节,所以很容易将每个基因映射到一个编程代码(注意,1double=8字节;仍然等于数组中的一个槽)。
5.易于指令扩展
大多数编程语言的解释器只是执行代码,维护内存值,并包括对控制台输入/输出的支持。但是,它可以扩展解释器来支持生成图形、网络功能、文件系统访问以及更多的内容。联想一下,你可以给予人工智能开发自己的程序的力量!)
它是如何工作的
AI程序的工作原理如下:
基因组由一组double组成。
每个基因都对应于一个brainf-ck编程语言的指令
从随机基因组的群体开始。
通过将每个基因组译码成相应的指令,将每个基因组解码成一个结果程序并执行
根据控制台输出(如果有)获得每个程序的适应度评分并对其进行排序。
用轮盘选择、组合交叉和变异来配对最好的基因组,以产生新一代。
新一代重复这个过程,直到达到目标适应度。
由于fitness方法是计算成本最高的部分(它必须为每个成员执行程序代码,可能包括无限循环和其他讨厌的东西),人工智能程序在.NET4.5使用Parallel.ForEach方法。通过这种方式,它可以在群体中对每一代执行多个基因组的适应度算法。这使得程序可以最大化地利用CPU资源并利用多个CPU核。这个程序也会每隔1万代保存它的状态,以防程序或PC被关闭,它可以继续从它停止的地方搜索。
适应度方法
适应度方法是通过对生成程序的输出进行评分。这个分数是通过观察程序输出的每个字符来计算的(如果有任何输出的话),并从期望的字符中减去它的值:
当然,最初生成的程序甚至无法编译,更不用说输出文本到控制台了。这些都会被丢弃,输出一些内容的程序则会被留下来;并进一步引导和进化,直到输出结果越来越接近所需的解决方案。
解释指令集
brainf-ck由以下指令集组成:
结果呢?
hi
在大约1分钟的时间里,经过5700代,人工智能成功地编写了一个程序,输出了“hi”。它产生了以下代码:
虽然上面的代码包含解析错误,如非匹配的方括号,但是我们的模拟解释器在程序失败之前计算结果,因此在上面的例子中,语法错误(在找到解决方案后,代码中稍后会出现)不会影响到适应度。
您可以尝试将上面的代码粘贴到一个brainf-ck解释器中。单击“开始调试”,忽略警告,然后单击“运行到断点”。注意输出。
如果我们对多余的代码进行修剪,我们会看到以下的语法正确的代码:
你可以查看下面在程序运行时的截图:
AIlearninghowtoprogram
AIlearninghowtoprogram,almostthere
AIlearninghowtoprogram,asolutionisfound
AIprogramfitnessovertime
这是历史图表,随着时间的推移,绘制出适应分。您可以看到AI怎样学习如何用目标语言编程并实现所需的解决方案。
hello
在大约29分钟的时间里,在252,0000代后,人工智能成功地编写了一个程序,输出了“hello”。它产生了以下代码
在生成过程中,人工智能非常接近于一个解决方案,但是一对字母在一个循环中彼此绑定。人工智能在问题1中创建一个内部循环,成功地输出正确的字符,并继续进行处理。
AIlearninghowtoprogram
AIlearninghowtoprogram,asolutionisfound
AIprogramfitnessovertime
Executingtheprogram,developedbytheAI
Hi!
人工智能在大约2小时7分钟后,经过219,400代,成功地编写了一个程序输出“你好!“。它产生了以下代码:这实际上是我的最爱之一。运行它,您可以看到原因(单击启动调试器并运行到断点)。就好像电脑知道自己在做什么。有趣的是,这个程序的生成时间比前两个要长。这可能是由于使用的字符包括大写字母和符号。另外两个例子使用的字符在ASCII系统中值更接近,这对人工智能来说比较容易找到。
AIlearninghowtoprogram,asolutionisfound
Executingtheprogram,developedbytheAI
AIprogramfitnessovertime
在大约22分钟的时间里,人工智能成功地编写了一个程序输出“reddit”。它产生了以下代码:这是一个挑战。这可能是由于它的长度,或者可能是由于d的位置。人工智能会不断地停留在局部最大值内。局部最大值是当一个遗传算法找到了它在当前参数中所能看到的最好的适应度,即使还有一个更好的适应度可能存在。人工智能无法走出它的洞穴,达到更好的适应度,因为这样做会要求适应度再次增加之前先下降,这通常是违反遗传算法的规则的。
我可以通过增加变异函数的多样性来解决这个问题。在此之前,基因变异只会改变基因组中的一条指令。变异被增强,不仅包括变异单个位(替换变异),还包括改变位(插入变异)和转移(删除变异)。这种额外的多样性使人工智能得以继续前进。
AIlearninghowtoprogram
AIlearninghowtoprogram,asolutionisfound
AIprogramfitnessovertime
helloworld
这是在大约2小时内580900代之后产生的。它产生了以下代码:
如果你修剪掉多余的部分,打印文本的实际代码要短得多:
AIlearninghowtoprogram,asolutionisfound
AIprogramfitnessovertime
Iloveallhumans
这是在大约10小时6057,200代之后产生的。它产生了以下代码:
如果你修剪掉多余的部分,打印文本的实际代码更短:
在上面的运行中,AI提供了一个启动程序,指令数组大小为300(ie,300字节,或者更确切的说是2400字节,因为1倍=8字节)人工智能不需要完整的程序代码长度。它可以用209条指令编写程序。
注意,这个解决方案花了10个小时完成。然而,要记住,这是使用人工智能程序进行编程,而不是人类,他们完成一个程序所需的时间就会少一些。人工智能可以简单地在后台运行,而人类还要在其他任务上工作。我还预计,随着计算机在未来几年变得更快,计算时间将会显著减少。
未来
这个实验是一个概念验证,人工智能程序可以开发自己的计算机程序来执行特定的任务。在这方面,它是成功的。人工智能一开始可以对目标编程语言一无所知,而成功地学习如何生成一个有效的计算机程序,该程序在执行时,解决一个特定的任务。
与所有的遗传算法一样,这也涉及到设计适应度函数的工作。适应度函数相当于向人工智能描述你要找的东西。通过这种方式,创建适应度函数本身,有点像编程(代表人类)。如果人工智能有可能发展自己的适应度函数,这将是一个进步。与此同时,我们仍然可以开发这个项目来创建更复杂的子程序,比如那些接受用户输入,计算结果的程序。
十年前,这个项目在任何合理的时间内都不会成功。五年前,这个项目可能需要几天甚至更长的时间。今天,执行只花了几分钟时间。明天,程序可能以毫秒级运行。随着计算机的发展越来越快,越来越大的搜索空间可以计算出来。我等不及了。
如果你已经发现其中的趣味的并且想要了解更多,下载GitHub的完整源代码或者联系KoryBecker。阅读我关于使用c#.net中的遗传算法和神经网络的教程。本文中的可执行程序是Brainfuck.NET编译器编译的。
Mr派
(长按或扫码识别)