博舍

人工智能学习框架 人工智能框架的一般形式有哪些类型呢图片介绍

人工智能学习框架

五大主流人工智能学习框架sklearn

sklearn是机器学习框架,不支持GPU

TensortFlow2.0是深度学习框架,是目前使用人数最多的机器学习框架,支持GPUPytorch学术界最喜欢用的深度学习框架,支持GPUKerasCaffe

国内优秀深度学习框架

飞浆PaddlePaddle

其它深度学习框架

DarkNetMxNetTheano

人工智能(AI)之脑科学及创新思维

人工智能(AI)之脑科学及创新思维

  人工智能(AI),它是研究使计算机来模拟人的某些思维过程和智能行为(如学习、推理、思考、规划等)的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。人工智能(AI)将涉及到计算机科学、心理学、哲学、脑科学和语言学等学科。可以说几乎是自然科学和社会科学的所有学科,其范围已远远超出了计算机科学的范畴,人工智能(AI)与思维科学的关系是实践和理论的关系,人工智能(AI)是处于思维科学的技术应用层次,是它的一个应用分支。从思维观点看,人工智能(AI)不仅限于逻辑思维,要考虑形象思维、灵感思维才能促进人工智能(AI)的突破性的发展,数学常被认为是多种学科的基础科学,数学也进入语言、思维领域,人工智能学科也必须借用数学工具,数学不仅在标准逻辑、模糊数学等范围发挥作用,数学进入人工智能学科,它们将互相促进而更快地发展。

  脑科学,狭义的讲就是神经科学,是为了了解神经系统内分子水平、细胞水平、细胞间的变化过程,以及这些过程在中枢功能控制系统内的整合作用而进行的研究。(美国神经科学学会)广义的定义是研究脑的结构和功能的科学,还包括认知神经科学等。

  研究大脑,开发大脑,是世界各国科学家和学者所研究关注的热点问题之一,脑科学之所以受到各国科学家的积极关注,重点研究,是因为脑科学的研究,具有极为重要的意义。了解大脑工作的原理,为促进人工智能提供突破性的发展。

  创造性活动是提供新颖、独特,有一定社会意义的产物的活动。在这一活动中,创造性思维起着十分重要的作用。对于探索未知的创造性思维过程来说,需要创造性地、灵活地运用多种方法进行探索和研究工作,才能达到目的。创造性思维是思维活动的高级过程,是在有经验的基础上,通过多角度思维产生新颖独特的、有社会价值的产品的思维过程。

  创造性思维活动的过程是复杂多样的,它因创造课题的性质、类型、创造者的主客观条件的不同而有所不同,但一般都可分为如下四个阶段:

1、准备期。该期主要是收集有关资料,并通过严密的系统思考来处理资料,以寻找问题的症结所在和最佳的突破口,选择研究的方法。

2、酝酿期。此期主体经过不断地反复探索,但仍不能解决问题,从而出现一种百思不解的停滞状态。

3、豁朗期。此期新的观念、新的想法或经过有意识的努力逐渐形成,或在根本意想不到的时刻,以“顿悟”的形式突如其来,使问题迎刃而解,这实际上仍是前两个阶段思维活动的结果。

4、验证期。新的思想火花的闪现,仅仅使创造初露端倪,但并不是完整的创造,它还需要加以验证,修正与提高,直至形成较完美的观念或物质形态的创造性产品。

  从上面创造性思维活动过程的四个阶段的特点可以看出,左脑和右脑对于创造性思维来说都是必不可少的,但是,它们在创造过程的各阶段中所起的作用却有所不同。

  在创造过程的第一和第四阶段(即准备期和验证期),左脑起着主导的作用。因为在这两个阶段,人们更多地是发挥左脑的言语和逻辑思维功能,运用各种逻辑方法(如分析和综合、比较、抽象与概括等)去分析资料,研究前人成果,寻找问题的症结,确定研究工作的出发点和检验假设、形成概念,最后将研究结果系统化,形成逻辑严密的科学知识体系。在创造过程的第二和第三阶段(即酝酿期和豁朗期),右脑则起主导作用。这两个阶段是新思想、新观念产生的时期,因为也是创造性思维过程中最关键的时期。由于新思想的产生是没有固定的逻辑通过的,为此,就需要充分发挥右脑的想象、直觉、灵感等非逻辑思维功能。

  想象,是人脑对已有表象进行加工改造、重新组合,而形成新的形象。在创造性活动中,人们要揭示事物的本质、把握哪些不能为人们直接感知到的事物的隐蔽联系,填补知识链条的空白,创造出不曾有过的新产品,就必须借助于想象去设想事物内部过程相互联系,相互作用的图景,寻找解决问题的一般性原则和中介环节,构思新产品的形象。想象,可使人们突破个别经验认识的框子,而把握普遍性;通过有限,而深入到无限;超越现实的时空界限,而推测过去,预示未来:摆脱具体事物的束缚,而自由地重新组合。正因为有了它,人们创造性思维的行程才有了很大的自由,人们的思想才可以自由地飞翔。因此,右脑的想象功能不但在文学艺术创造中,而且在科学研究、技术发明中,都起着巨大的作用。

  直觉,是人脑依据以往的知识和经验,在无意识的条件下,从整体上,迅速猜测,预感或观察隐藏在现象背后的事物的本质属性或本质联系的一种思维方式。其特点是:跳跃式地进行,直接接触到问题的实质,似乎不存在中间的推导过程,主体不能明确意识到该过程的进行,也因之不用言语将其清楚地描述出来,大有“知其然,不知其所以然”之感。在创造性思维过程中,一方面由于问题都是不明确的,所需的事实和证据也常常十分有限,另一方面由于不存在一种凝固不变逻辑通道,去引导我们按图索骥地构思实验,建立模型,提出假设,寻找问题解决的中介思维环节。因此,左脑的分析思维是难以施展和奏效的,而只能依靠右脑的直觉思维,直觉思维方式虽然不能保证成功,但却容易引导成功,既是创造性解决问题所必需,当省时省力。可见,在创造性思维活动的过程中,右脑的直觉功能在确定研究方向、选择有前途的研究课题、识别有希望的线索、预见事物的发展进程和研究工作的可能结果、提出假设、寻找解决问题的有效途径、领悟机遇的价值、在缺乏可供推理的事实时决定行动的方案、在未获得决定性佐证时形成对新发现的看法等等方面,都具有重要的作用。

   灵感,是创造性思维过程中普遍存在的一种客观现象。对于一些曾集中精力、长时间反复探索而又尚未解决的问题,人脑有时会有意无意地突然出现某些新的形象、新的思想,产生一下子使问题得到澄清的顿悟,这种现象即灵感。在创造性思维活动的过程中,既有长时间的准备和积累,又有短时间的攻关和突破,既有经久的沉思,又有一时的顿悟。灵敏就是在创造性实践和思考活动的基础上,思维运动发展到一定关节点时,而产生的一种质的飞跃。有关的调查和科学家们的自述表明,无论是文学家、艺术家、还是自然科学家、社会科学家,他们在创造思维过程中不但都经常出现灵感,而且其许多新思想、新观念的涌现、新思路的产生、新形象的形成,都与灵感密切相联。大量事例证明,灵感大多出现在思维长期紧张工作之后的暂时松驰状态,如散步、钓鱼、洗澡、听音乐、观花赏月乃至睡梦中。此时,主体精神放松、抑制解除、遇想丰富、想象活跃,右脑正处于积极活动之中。不少事例还表明,灵感常常是受某事物的启发而产生的,这种起启发作用的事物被称之为“原型”。在我们周围的客观世界中,无处不隐蔽着大量的启示,提供人们作为原型,以取得丰富的创造性设想,发现原型与所要寻求事物的相似之处,看出它们之间的隐蔽关系,也即从变化的背景和改变形式的事物中将所需要的东西再认出来,是创造性突破的关键一步。可见,在创造性思维过程中有重要作用的灵感,与右脑活动有密切的联系。

   总之,从上述种种情形可以看出,左脑在创造性思维活动过程的一、四阶段起主导作用,右脑在二、三阶段起主导作用,这是由左右脑功能特点和完成各阶段的主要任务对不同思维类型的需求所决定的。当然,这种主次作用是相对而言的,它并不意味着在一、四阶段右脑就不起作用,左脑就不参与二、三阶段的活动了。事实上,在创造性思维活动过程的每一阶段,左右脑思维都既是需要而且也是密切配合的,只不过是在其中某一具体的思维活动中,它们是有主有次的。因此,不但在整个创造性思维活动的过程中,而且在其中的每一个阶段中,都可能发生多次左右脑主导地位的转移。纯粹的左脑思维和纯粹的右脑思维,在实际的创造性思维活动过程中都是罕见的,任何创造性产物,都是左右脑密切配合,协同活动的结果。

  当前人工智能(AI)在模拟人类智能上还存在诸多障碍,这让很多人相信终结者的出现还非常遥远。

  譬如现阶段让机器学习人类的知识就不容易。这种学习有个困境——计算机学到的知识未必是人类全部的知识。李杰认为,人在自身智慧的基础上学习别的智慧的功能,就不能被机器复制。“比如人会因为某一条信息醍醐灌顶,人类称之为灵感,灵感是精神上的、无形的、不能编程的。我认为,机器可以取代知识,可以慢慢帮助人类做决策,但是灵感是其无法实现的,灵感是由人的智慧(wisdom)跟个人的精神所造成的一种很即时的冲击,无法量化描述,而机器是以目标为准。当以目标为准时,比如在打字速度、翻译速度、计算能力上,人脑的确竞争不过电脑,但当人以价值为准,道德价值、意识价值,电脑就不知如何与人相比。”

  难以数字化处理的并非只有灵感。人有个特质在现象学上叫具身性——有身体、有感知,有直觉,可以跟周边环境接触获得知识,这种知识与不跟外界接触、完全靠推理得来的知识不一样,打个比方:眼睛的转动可以帮注意力集中做出多种选择,这是人生活在世界上跟周边环境接触形成的,很难提炼出来放到计算机中去。再如两条腿走路,要在机器人身上实现并不容易,因为涉及人如何使用力气来抵抗地心引力,这是人上百万年来生物进化后自然而然的反应,要把这个技能加诸机器人身上,会涉及大量的计算,而且这种运转需要非常复杂的机电控制系统,保证它像人体四肢那样可靠地精密运转有很大挑战。总而言之,人的知识来自于社会和交往,这种知识很难形式化,知识的形式化边界至少在目前来看也是数字计算机的能力边界,人工智能(AI)缺乏具身性特征,难以从周边环境中获得这些不能形式化的知识。

  湖南师范大学人工智能(AI)道德决策研究所兼职研究员陈自富认为,“即便是最乐观的计算机科学家也认为人工智能(AI)在21世纪达到单个人的智力水平,这已经不错了,但其中不涉及情和意。”知的方面,在未来20多年内,计算机可以达到一个很高的水平,人工智能(AI)大致能帮助普通个人做出不那么糟糕的决策,譬如帮人计算存一笔钱是否划得来,存定期还是活期,买哪支股票。“对于确定的任务,人工智能(AI)可以做得到,而一些非确定性的任务则很难。说白了,机器只有不断进化,成为我们社会的一员,才能达到人类水平。”

  人工智能(AI)最终达到或超越人类智慧,必须要跨越机器与人的差别。这种差别主要是理性、信仰和群体交往中的情感互动、文化基因。创造出有意识、有情感的人工智能(AI),怀此愿望的科学家不在少数,阿森克特说过,我们能够实现让机器人像人类一样思考,但构建完美的机器人大脑需要很长时间。

作者:Roger_CoderLife

链接:https://blog.csdn.net/Roger_CoderLife/article/details/79741127

本文为Roger_CoderLife的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!

人工智能框架数据集转换C++实现(二):Lmdb数据集

最近在研究将各种数据集转换为不同AI框架的自有数据,这些框架包括Caffe,MXNet,Tensorflow等.C++这样一个通用而又强大的语言,却让使用C++的同鞋在AI时代有一个痛点,那就是目前的AI框架基本都是底层用C/C++实现,但提供的接口却大部分都是python的接口,而且Python的接口封装的都特别好,MXNet还好,提供im2rec.cc这样的C/C++源码,而Caffe,尤其是Tensorflow这样的框架,想用C++来转换数据就需要花点功夫了.前一章讲解了TFRecord格式的转换C++实现,本文讲解Caffe的Lmdb格式的转换实现,虽然Caffe中caffe/examples/imagenet含有create_imagenet.sh文件,该文件会调用convert_imageset.cpp代码,但仍然存在的问题是Caffe代码众多,如果只是学习的话有的同鞋可能会看的一头雾水,这些转换代码到底和哪些文件相关呢?如果我把转换代码单独拿出来,这部分代码能有多少呢?检测任务的代码在单独的ssh-caffe中,能否将分类代码和检测的统一呢?这就是我们这篇文章的目的.

1.不同框架的数据分别是怎样的?

MXNet的自有数据集:rec格式

Caffe的自有据集:Lmdb格式

Tensorflow的自有数据集:TFRecord格式

2.什么是Lmdb格式?

lmdb是LightningMemory-MappedDatabase的缩写.闪电般的内存映射数据库。它文件结构简单,一个文件夹,里面一个数据文件,一个锁文件。数据随意复制,随意传输。它的访问简单,不需要运行单独的数据库管理进程,只要在访问数据的代码里引用LMDB库,访问时给文件路径即可。 它包含一个数据文件和一个锁文件.

caffe中的数据集借助了protobuf的表现形式,但是一个标准的caffe.proto特别大(数千行),哪些是我们需要的呢?别急,咱们只需要下面这么点数据(不到60行代码):

syntax="proto2";packagecaffe;messageDatum{optionalint32channels=1;optionalint32height=2;optionalint32width=3;//theactualimagedata,inbytesoptionalbytesdata=4;optionalint32label=5;//Optionally,thedatumcouldalsoholdfloatdata.repeatedfloatfloat_data=6;//Iftruedatacontainsanencodedimagethatneedtobedecodedoptionalboolencoded=7[default=false];}//Thelabel(display)nameandlabelid.messageLabelMapItem{//Bothnameandlabelarerequired.optionalstringname=1;optionalint32label=2;//display_nameisoptional.optionalstringdisplay_name=3;}messageLabelMap{repeatedLabelMapItemitem=1;}//Thenormalizedboundingbox[0,1]w.r.t.theinputimagesize.messageNormalizedBBox{optionalfloatxmin=1;optionalfloatymin=2;optionalfloatxmax=3;optionalfloatymax=4;optionalint32label=5;optionalbooldifficult=6;optionalfloatscore=7;optionalfloatsize=8;}//Annotationforeachobjectinstance.messageAnnotation{optionalNormalizedBBoxbbox=2;}//Groupofannotationsforaparticularlabel.messageAnnotationGroup{optionalint32group_label=1;repeatedAnnotationannotation=2;}//AnextensionofDatumwhichcontains"rich"annotations.messageAnnotatedDatum{optionalDatumdatum=1;//Eachgroupcontainsannotationforaparticularclass.repeatedAnnotationGroupannotation_group=3;}

这是一个protobuf2的格式定义,需要使用以下命令通过该文件生成头文件caffe.pb.h和cc文件caffe.pb.cc:

protoc-I=.--cpp_out=./caffe.proto

3.自有数据集该准备成什么样?

此处以VOC2007数据集为检测任务的例子讲解,LFW数据集为分类任务讲解.

对于分类任务,数据集统一构建一个这样的列表,该表的构建使用过caffe的同鞋应该很熟悉(略有不同的是,文件名和标签中间不是空格,而是 ,这是因为防止标签或者图像文件中包含空格的情况):

/output/oldFile/1000015_10/wKgB5Fr6WwWAJb7iAAABKohu5Nw109.png0/output/oldFile/1000015_10/wKgB5Fr6WwWAEbg6AAABC_mxdD8880.png0/output/oldFile/1000015_10/wKgB5Fr6WwWAUGTdAAAA8wVERrQ677.png0/output/oldFile/1000015_10/wKgB5Fr6WwWAPJ-lAAABPYAoeuY242.png0/output/oldFile/1000015_10/wKgB5Fr6WwWARVIWAAABCK2alGs331.png0/output/oldFile/1000015_10/wKgB5Fr6WwWAV3R5AAAA5573dko147.png0/output/oldFile/1000015_10/wKgB5Fr6WwaAUjQRAAABIkYxqoY008.png0.../output/oldFile/1000015_10/wKgB5Vr6YF-AALG-AAAA-qStI_Q208.png1/output/oldFile/1000015_10/wKgB5Vr6YGCAe1VYAAABN5fz53Y240.png1/output/oldFile/1000015_10/wKgB5Vr6YGCAQo7fAAABVFasXJ4223.png1/output/oldFile/1000015_10/wKgB5Vr6YGCAL00yAAABJdrU4U0508.png1/output/oldFile/1000015_10/wKgB5Vr6YGCAFjTyAAABJVgoCrU242.png1/output/oldFile/1000015_10/wKgB5Vr6YGCAKmMMAAABMd1_pJg240.png1/output/oldFile/1000015_10/wKgB5Vr6YGCAR2FqAAABFCQ7LRY651.png1

对于VOC2007数据集,构建的列表如下(略有不同的是,文件名和标签中间不是空格,而是 ,这是因为防止标签或者图像文件中包含空格的情况):

/home/test/data/VOC2007/JPEGImages/004379.jpg/home/test/data/VOC2007/Annotations/004379.xml/home/test/data/VOC2007/JPEGImages/001488.jpg/home/test/data/VOC2007/Annotations/001488.xml/home/test/data/VOC2007/JPEGImages/004105.jpg/home/test/data/VOC2007/Annotations/004105.xml/home/test/data/VOC2007/JPEGImages/006146.jpg/home/test/data/VOC2007/Annotations/006146.xml/home/test/data/VOC2007/JPEGImages/004295.jpg/home/test/data/VOC2007/Annotations/004295.xml/home/test/data/VOC2007/JPEGImages/001360.jpg/home/test/data/VOC2007/Annotations/001360.xml/home/test/data/VOC2007/JPEGImages/003468.jpg/home/test/data/VOC2007/Annotations/003468.xml...

4.数据集转换的流程是怎样的?

数据列表准备好之后,就可以开始分析数据集转换的流程,大体上来说就是对于分类任务,首先初始化一个LMDB和Transaction,然后处理列表中的数据,每一行对应一个Datum,每行包含图片路径和相应的标签,使用OPENCV读取图片为Mat后,将其转换为Datum的格式,并获取图片的宽高通道数,标签等信息,也都保存到Datum中,最后将每行的Datum序列化SerializeToString为string,调用Transaction写入.分类任务智慧使用到caffe.proto中的Datum,对于检测任务区别则在于增加了对xml文件的解析,并保存bbox信息等,同时也会使用到caffe.proto中的AnnotatedDatum和NormalizedBBox.

首先需要构建几个类,其中定义相关的虚函数,这些类定义在文件db.hpp和文件db.cpp中,代码如下,该代码对caffe中的db.cpp和db.hpp有所删减:

#ifndefCAFFE_UTIL_DB_HPP#defineCAFFE_UTIL_DB_HPP#include#include"caffe.pb.h"namespacecaffe{namespacedb{usingnamespacestd;enumMode{READ,WRITE,NEW};classCursor{public:Cursor(){}virtual~Cursor(){}virtualvoidSeekToFirst()=0;virtualvoidNext()=0;virtualstringkey()=0;virtualstringvalue()=0;virtualboolvalid()=0;};classTransaction{public:Transaction(){}virtual~Transaction(){}virtualvoidPut(conststring&key,conststring&value)=0;virtualvoidCommit()=0;};classDB{public:DB(){}virtual~DB(){}virtualvoidOpen(conststring&source,Modemode)=0;virtualvoidClose()=0;virtualCursor*NewCursor()=0;virtualTransaction*NewTransaction()=0;};DB*GetDB();}//namespacedb}//namespacecaffe#endif//CAFFE_UTIL_DB_HPP

db.cpp代码如下,该代码对caffe中的db.cpp和db.hpp有所删减:

#include"db.hpp"#include"db_lmdb.hpp"#include"glog/logging.h"#includenamespacecaffe{namespacedb{DB*GetDB(){returnnewLMDB();}}//namespacedb}//namespacecaffe

基于以上几个类,集合lmdb可以继承出3个主要的类,分别是LMDB,LMDBTransaction以及LMDBCursor,这几个类既可以构成caffe中操作lmdb的主要类,代码保存在db_lmdb.hpp和db_lmdb.cpp中,其中db_lmdb.hpp代码如下,db_lmdb.cpp代码可自行去caffe中查找,这部分代码并未删减:

#ifdefUSE_LMDB#ifndefCAFFE_UTIL_DB_LMDB_HPP#defineCAFFE_UTIL_DB_LMDB_HPP#include#include#include"lmdb.h"#include"db.hpp"#include"glog/logging.h"namespacecaffe{namespacedb{inlinevoidMDB_CHECK(intmdb_status){CHECK_EQ(mdb_status,MDB_SUCCESS)set_channels(cv_img.channels());datum->set_height(cv_img.rows);datum->set_width(cv_img.cols);returnReadFileToDatum(filename,label,datum);}EncodeCVMatToDatum(cv_img,encoding,datum);datum->set_label(label);returntrue;}CVMatToDatum(cv_img,datum);datum->set_label(label);returntrue;}else{returnfalse;}}

ReadProtoFromTextFile函数是检测任务读取标签map文件的函数,该map文件格式如下:

item{name:"aeroplane"label:0display_name:"aeroplane"}item{name:"bicycle"label:1display_name:"bicycle"}item{name:"bird"label:2display_name:"bird"}item{name:"boat"label:3display_name:"boat"}

该函数定义为:

boolReadProtoFromTextFile(constchar*filename,Message*proto){intfd=open(filename,O_RDONLY);CHECK_NE(fd,-1)insert(std::make_pair(name,label)).second){LOG(FATAL)clear_annotation_group();switch(type){caseAnnotatedDatum_AnnotationType_BBOX:intori_height,ori_width;GetImageSize(filename,&ori_height,&ori_width);if(labeltype=="xml"){returnReadXMLToAnnotatedDatum(labelfile,ori_height,ori_width,name_to_label,anno_datum);}else{LOG(FATAL)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇