可以用gpu加速训练,可以通过增加'useGPU'字段:train(net,P,T,'useGPU','yes');或先将数据集P,T通过函数Pgpu=gpuArray(P);Tgpu=gpuArray(T);转移到gpu内存中,再调用训练函数train(net,Pgpu,Tgpu)但是需要注意以下几点:
1,由于要在gpu上训练,网络的权重调整也会在gpu内进行,所以会占用gpu的内存,内存占用率与数据集的大小相关,可以通过下面的代码了解内存占用:
gpudev=gpuDevice;%事先声明gpudev变量为gpu设备类
%其他代码
gpudev.AvailableMemory%实时获得当前gpu的可用内存
可以通过尝试不同的数据集大小选择一个合适的数据集大小
2,大部分gpu处理double类型的数据能力并不强,所以如果想要取得较好的训练效果,需要使用single数据类型的数据集,例:
P=single(P);%将double型的P转为single型
T=single(T);%将double型的T转为single型
train(net,P,T,'useGPU','yes');
但是matlab的神经网络工具箱的一个函数可能有bug,在gpu上运行double变量的数据集时没有问题,但运行single变量时可能会弹出如下错误:
Error using gpuArray/arrayfun
Variable xx changed type.
修复该问题需要在源文件上作一些修改,具体内容这里没法三言两语说清楚,如果遇到该问题可以留言
经过本人测试,single型的数据集在gpu上可以取得数十倍的加速,具体加速情况与具体gpu型号有关
谷歌人工智能写作项目:小发猫
matlab 从2008版开始就对代码的语法结构进行了很大的改动神经网络bug。在2010版本里面已经不再主张使用这种初始化神经网络的方法了。
简单的做法是net = newff(Input, Target, StructuralArray, TrasnferFcns);
你上面的这个代码改成这样
net_1 = newff(P, T, [10, 5], {'tansig' 'purelin' 'purelin'}, 'traingdm')
其中,transfer function要比你的隐层数量多一个,因为输出层的节点数量是不能设置的,这个是根据你前面给的T来确定的。最后一个'purelin'就是你输出层的transfer function。
另外,我不知道你这个神经网络是要做什么用的,通常这样设置transfer function是很危险的。这样设置transfer function会让结果非常不稳定,虽然收敛的速度会变快。你在做外推或者内插的时候,误差会非常大。所以通常使用的都是log sigmoid函数放在中间。毕竟你前面已经给出了一个mapminmax(),所以我认为你已经做完归一化了。那么使用log sigmoid函数比使用tangent sigmoid函数要有一点优势。不过这个根据你自己的需要来,我只是说通常不这样做而已。
后面的代码粗略的看了一下,如果有bug自己不能修复再回复我或者发新帖子吧。
计算机和人工智能当然有可能犯错,而且一旦犯错,往往会导致巨大的危险。
假如一辆自动驾驶的汽车,把迎面而来的白色卡车认错成一朵白色的云,那么后果不堪设想。要避免这样的悲剧发生,人工智能领域的研究人员必须非常对于日常中最常见的意外有深度的认识,这样的话,机器才可以变得更加聪明。这也正是谷歌在做的事——同时研究人脑和神经网络。到现在为止,神经网络的意义在于人眼不会认错的地方,机器也不会认错。
自从20年前深蓝(Deep Blue)在国际象棋中击败卡斯帕罗夫(Garry Kasparov),该事件就被人们誉为机器智能最权威的证明。谷歌的AlphaGo已经在围棋比赛中以四胜一负赢得了韩国棋手李世石,更表明了这些年来人工智能的迅猛进步。机器终会比人类更聪明的预言即将到来,但我们似乎并没有真正理解这个具有划时代意义的事件的影响。 事实上,我们执着于对人工智能的一些严重的、甚至是危险的误解。
很难知道该相信什么。但借助于计算科学家,神经科学家,和人工智能理论家的创举,我们可以逐渐了解关于人工智能更清晰的图景。下面是关于人工智能最常见的误解和虚传。
一、人工智能由于其极高智能,将不会犯任何错误。
Surfing Samurai机器人人工智能研究者和开发者,Richard Loosemore认为大多数假设的人工智能将毁灭世界的情景都非常不符合逻辑。大多数类似的假设总是认为人工智能将会说:“我知道毁灭人类文明是由于设计引起的故障,但无论如何我还是很想去做。”Loosemore指出如果人工智能在打算毁灭人类时,其思路是如此自相矛盾的话,它将在其一生中面临无数自相矛盾的逻辑推理,也因此会干扰了其认知从而变得非常愚蠢,而同时根本不足以对我们造成伤害。他同时也断言,那些认为“人工智能只会做程序设定的任务”的人,将会像在电脑刚刚发明时那些说电脑将永远不会具备应变能力的谬论的人一样。
二、我们永远不会创造出类似人类智慧的人工智能
我们已经在一些游戏领域,如象棋与围棋、股市交易和谈话等创造出可以与人类智慧匹敌、甚至超过人类的计算机。 而背后驱动的计算机和算法只会越来越好;因此,计算机赶超其他人类活动,将只是个时间问题。
当怀疑论者说这是一个无法解决的技术问题,或是生物大脑有一些内在的独特之处时,是不能令人信服的。我们的大脑是生物机器,但归根到底它们仍然是机器;他们在现实世界中存在,按照物理学的基本规律运行。没有什么是不可知的。
三、人工智能将有自觉意识
关于机器智能的一个共同的假设是,它是自觉的有意识的,也就是说,它会像人类一样思考。我们完全可以想象一个非常聪明的机器,缺乏一个或多个这种属性。最后,我们可以建立一个非常聪明的,但没有自我意识的,不能主观或有意识地体验世界的人工智能。
只是因为一台机器通过图灵测试从而证实计算机和人类在智能上无区别,并不意味着它是有意识的。对我们来说,先进的人工智能可能会导致机器看起来是意识的假象,但是在自我自觉方面,它并不比一块岩石或计算器更能感知自我意识。
四、我们不应该害怕人工智能。
一个高度智慧的系统也许能了解完成一个特定任务所需要的所有知识,例如解决一个让人头痛的财务问题,或者侵入一个敌人的系统。但除开这些它所专长的特定的领域外,它很可能非常无知和愚昧。
五、一个简单的修补程序将解决人工智能的控制问题。
假设我们创造出强于人类的人工智能,我们将要面对一个严重的“控制问题”。未来主义者和人工智能理论家完全不知如何限制和制约一个ASI(超强人工智能),一旦它被创造出来,也不知道如何保证它将对人类友好。最近,佐治亚理工的研究人员天真地认为人工智能可以通过阅读简单的故事和社会习俗来学习人类价值观。而问题很可能会远远比这复杂。
所以,理论上,如果不停挑战AI所不擅长的复杂选点棋局,是有可能发现AI的问题,引起过拟合现象的。就像前面提到的,李世石对战AI第四盘棋中的“神之一手”。不是因为这一手够正确,而是因为这一手够怪。
简单来说,你只要不停走AI没见过的棋局变化,是有可能引起AI出“bug”的。哪怕是在现在很成熟的AI系统上,过拟合的风险。以人脸识别为例,只需要你在脑门上张贴类似于人脸其他器官纹理的贴纸,就能轻易让AI错乱。
AI确实征服了很多难题,但现在的AI也绝非完美。需要我们去了解其原理,并将其优势为我所用。就像现在的围棋棋手们,未选择用“怪棋”挑战AI的极限,而选择了和AI共同进步学习那样。这才是我们和AI的相处之道。
首先,ControlFlag是完全自我监督的机器编程系统,不需要人类对其进行训练及指导。ControlFlag的无监督模式识别方法使它可以在本质上学习适应开发者的风格。在要评估的控制工具的有限输入信息中,ControlFlag可以识别编程语言中的各种样式,不受代码使用的编程语言限制。
第二,ControlFlag检测bug的功能集成了机器学习、形式化方法、编程语言、编译器和计算机系统。据悉,ControlFlag通过一个称为异常检测的功能来进行bug检测,通过学习经验证的例子来检测正常的编程模式,并找出代码中可能导致bug的异常。该工具将学会识别和标记这些风格选择,并根据其见解进行自动的错误识别和建议解决方案,以便ControlFlag能够尽可能地避免将两个开发团队之间的风格差异视为代码错误。
自动检测bug的系统好不好用?英特尔已经开始评估内部使用ControlFlag来发现自己的软件和固件产品化中的错误。这是英特尔开发人员快速分析项目的一个关键组成部分,该项目旨在通过提供专家支持来帮助程序员加快速度。
机器编程更偏向随机
英特尔机器编程研究系统ControlFlag从超过十亿行的代码中学习,英特尔研究院机器编程研究表示,这在机器编程系统中尚属首次。另外,对于跨架构硬件来说,能够正确、高效、安全地编写代码的程序员稀少,从而导致代码中存在难以发现的新错误。而ControlFlag检测现有软件中的违规或异常情况,使可能已经在生产质量系统中存在了20多年的隐疾得以发现。过去可能有数百名开发人员查看过这些代码,但都没有意识到任何问题,现在ControlFlag可以实现人力不能达到的效果。
英特尔研究院机器编程研究融合了两种方法,来推动大量的机器编程研究,一种是形式化方法,一种是随机方法(stochastic approaches)。英特尔研究院机器编程研究分析目前业界在机器编程领域方面的工作发现,机器编程更偏向随机方法,并得到了很大的重视,例如深度神经网络和贝叶斯网络(Bayesian networks)等等。事实上,英特尔研究院机器编程研究表示,他们的某些合作伙伴或竞争对手正在做神经网络编程,使用神经网络来替换大量代码。这样做有好处,但是当遇到诸如可解释性或debug问题时,这样做也有风险。
在正确的应用场景,机器编程对开发效率的提升惊人。Justin表示,在某个案例中,用传统的软件技术,开发完成大约需要三年时间,有了先进的机器编程技术,只需要花一天的时间,就能开发完成同样质量的软件。“很多例子表明,不管是与我们的合作伙伴项目,还是我们自己内部的开发项目,机器编程都将生产率提高了一千倍以上。”
降低行业准入门槛,从业者创造性会更强
机器编程发展是否会让英特尔的程序员失业呢?Justin表示:不会。相反,机器编程实际上会创造数千万到数亿个就业机会。他进一步解释到:首先,当今存在的大多数机器编程系统都需要大量的数据,这些数据通常是以代码的形式存在,而代码是由专业程序员编写。因此,随着自动化的发展,英特尔研究院机器编程研究对高技能程序员的需求增加,以推进系统的进步升级。最重要的是,如果英特尔研究院机器编程研究的意图系统成功,即允许用户向机器表达他或她的意图的系统,这将降低行业准入门槛。
机器编程会为全新类型的程序员创造大平台,从业者创造性会更强,而机器和系统会把这些想法综合起来做出软件。如今,通过ControlFlag和类似的系统,程序员可以显著减少调试时间,并将更多的时间花在人类程序员最擅长的工作——向机器呈现创造性的新思想。完全实现的ControlFlag可以通过自动化繁琐的软件开发工作(如测试、监控和调试)来帮助缓解上述挑战,同时可以解决当前软件开发中耗时费力代价昂贵的bug修复问题。
图:在全球78亿人中,只有2700万人会编写代码,占比不到 1%。英特尔希望借助机器编程技术,使所有人获得编程能力。
英特尔推进机器编程的最终目标是让每个人都能创建软件。当这一目标完全实现时,每个人都可以通过自己最擅长的方式,如代码、自然语言或其他方式向机器表达自己的设计意图,从而创建软件。这是一个大胆的目标,需要英特尔及合作伙伴付出许多努力。
做理性自由的破题者
算法与算力的进步,以及可用代码库的极大丰富,让机器编程拥有适宜的孕育环境;随着近年计算技术的迅猛发展,机器编程迎来重要拐点。英特尔一直以来的作风便是积极打破传统,开拓新的研究或工程领域,这些领域在英特尔研究院机器编程研究突破界限之前还无人涉及。此次异构系统领域亦是一片“处女地”,英特尔的创新驱动力来自于对这一未来技术趋势的预测。
图:英特尔与麻省理工学院研究人员联合发表的愿景论文提出机器编程有三大支柱,分别是意图(intention)、创造(invention)、适应(adaptation)
如前所述,异构系统非常复杂,能够切实掌握异构系统编程技术的工程师少之又少,英特尔研究院机器编程研究正在开发某种机制,让程序员或非程序员不仅能够轻松访问异构硬件,还能充分使用其他系统可用资源,以大幅降低异构编程难度。这也是英特尔机器编程的基本驱动力之一。
你可以先生成net网络,经训练后即可调用gensim函数。我给你看一个例子吧:
%训练样本集
%输入向量
P=[756.5745 765.3261 762.9077 762.7337 778.0583 768.4183 753.3221 754.777 869.1892 837.8081 850.121 871.7502 886.9313 896.7662 844.2693 878.671 936.677 953.5296 936.9523 972.7305 969.6961 966.8402 967.3992 991.9504;
20 20 20 20 45 45 45 45 20 20 20 20 45 45 45 45 20 20 20 20 45 45 45 45];
%目标向量
T=[750 750 750 750 750 750 750 750 850 850 850 850 850 850 850 850 950 950 950 950 950 950 950 950];
%输入向量、目标向量归一化
p=(P-[750;20]*ones(1,24))./([950;45]*ones(1,24)-[750;20]*ones(1,24));
t=(T-750)/(950-750);
%创建BP网络:网络含5个隐层和一个输出层
net=newff([0,1;0,1],[5,1],{'tansig','logsig'},'trainlm');
%对网络进行训练
net=train(net,p,t);
%保存网络
save cellnet net
%生成模块
gensim(net,-1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
首先需要指出的是,newff函数是用来产生新的网络的,使用时输入向量的维数可以是任意的。
下面是我写的几行命令,newff命令中的minmax(X)决定了新生成网络的输入为5维
%输入向量
X=[0 0.5398 0.5325 0.5324;
0 -0.9341 0.9339 -0.9327;
0 -6.4617 0.8567 0.8850;
0 10.3576 -10.1934 8.9586;
0 10.9531 31.1317 51.2697];
%目标向量
T=[0 10.9630 31.1417 51.2796];
%输入向量、目标向量归一化:你自己补充一下
%创建BP网络:假设网络含5个隐层和一个输出层
net=newff(minmax(X),[5,1],{'tansig','logsig'},'trainlm');
%对网络进行训练
net=train(net,X,T);
%生成模块
gensim(net,-1)
%需要指出的是,上面调用的newff函数的用法是基于MATLABR2007或者早些版本的。MATLABR2008a上调用时会稍微有所不同。你可以用help看看
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
输入输出都是按行归一化的。每一个输入矩阵中,每一列都是一个训练或测试样本,对列输入没有意义的。
我用的是MATLABR2008版的,你的那段程序在语法上除了归一化不正确导致的一些问题和newff调用警告外好像没有其他的bug
BugBrain是一个让你构造神经网络来指挥一只虫子活动的游戏,但其神经网络编辑和模拟功能却相当直观,相当强大。最开始可以构造进行初级逻辑判断、具有简单记忆能力的网络,然后用复杂的神经网络指挥虫子在复杂环境中觅食求生,最终甚至可以试着构建具有学习能力的神经网络,并教会它识别手写字母!用来入门了解神经网络实在是太合适不过了。
这是编辑神经网络的界面,黄色的线就是神经元之间的连接,绿色的点点就是神经元,黄色点点是节点,红色的点点是感觉输入端,蓝色的点点是行为输出端。