1 人工智能简介
人工智能在近几年的 IT 领域可以说是被炒的火热,但大部分人对人工智能仍然是一头雾水,究竟什么是人工智能?人工智能应用在什么地方,人工智能和人类智能有什么联系,人工智能是怎么发展的,下面对人工智能做一个笼统的概述。
在计算机出现之前人们就幻想着一种机器可以实现人类的思维,可以帮助人们解决问题,甚至比人类有更高的智力。随着上世纪 40 年代计算机的发明,这几十年来计算速度飞速提高,从最初的科学数学计算
演变到了现代的各种计算机应用领域,诸如多媒体应用,计算机辅助设计,数据库,数据通信,自动控制等等,人工智能是计算机科学的一个研究分支,是多年来计算机科学研究发展的结晶。
人工智能(Artificial Intelligence),英文缩写为 AI。是一门基于计算机科学,生物学,心理学,神经科学,数学和哲学等学科的科学和技术。人工智能的一个主要推动力是要开发与人类智能相关的计算机功
能,例如推理,学习和解决问题的能力。首先看一下智能是什么:智能,是智力和能力的总称,中国古代思想家一般把智与能看做是两个相对独立的概念。其中,“智”指进行认识活动的某些心理特点,“能”则指进行实际活动的某些心理特点。
2 机器学习定义
机器学习应用领域十分广泛,例如:数据挖掘、数据分类、计算机视觉、自然语言处理(NLP)、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA 序列测序、语音和手写识别、战
略游戏和机器人运用等。机器学习就是设计一个算法模型来处理数据,输出我们想要的结果,我们可以针对算法模型进行不断的调优,形成更准确的数据处理能力。但这种学习不会让机器产生意识。
➢ 机器学习的工作方式
- 选择数据:将你的数据分成三组:训练数据、验证数据和测试数据。
- 模型数据:使用训练数据来构建使用相关特征的模型。
- 验证模型:使用你的验证数据接入你的模型。
- 测试模型:使用你的测试数据检查被验证的模型的表现。
- 使用模型:使用完全训练好的模型在新数据上做预测。
- 调优模型:使用更多数据、不同的特征或调整过的参数来提升算法的性能表现。
➢ 依据学习形式的分类
监督学习(supervisedlearning)
非监督学习(unsupervisedlearning)
监督学习(SupervisedLearning)是指利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程,也称为监督训练或有教师学习。也就是我们输入的数据是有标签的样本数据(有一个明确的标识或结果、分类)。例如我们输入了 50000 套房子的数据,这些数据都具有房价这个属性标签。
非监督学习(UnsupervisedLearing)是另一种研究得比较多的学习方法,它与监督学习的不同之处,
在于我们事先没有任何训练样本,而需要直接对数据进行建模。是否有监督(Supervised),就看输入数据是否有标签(Label)。输入数据有标签(即数据有标识分类),则为有监督学习,没标签则为无监督学习(非监督学习)。在很多实际应用中,并没有大量的标识数据进行使用,并且标识数据需要大量的人工工作量,非常困难。我们就需要非监督学习根据数据的相似度,特征及相关联系进行模糊判断分类。
深度学习(Deep Learning),它属于机器学习的一个子类。它的灵感来源于人类大脑的工作方式,是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并非是一个全新的概念,可理解为包含多个隐含层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法以及激活函数等方面做出了调整。其目的在于建立、模拟人脑进行分析学习的神经网络,模仿人脑的机制来解释数据,如文本、图像、声音。深度学习通过组合低层特征形成更加抽象的高层特征(或属性类别)。例如,在计算机视觉领域,深度学习算法从原始图像去学习得到一个低层次表达,例如边缘检测器、小波滤波器等,然后在这些低层次表达的基础上,通过线性或者非线性组合,来获得一个高层次的表达。此外,不仅图像存在这个规律,声音也是类似的。比如,研究人员从某个声音库中通过算法自动发现了 20 种基本的声音结构,其余的声音都可以由这 20 种基本结构来合成!
3 机器学习必备技能
3.1 语言技能
要向人工智能方向做开发,就必须掌握人工智能最火的语言。目前主要掌握 Python和 C++即可,绝大多数的相关代码都是 Python 编写,如果不会 Python,人写的代码看不懂,想使用别人
一段代码或者一个功能模块,自己还需要使用另一种语言实现,简直就是头疼。主流的机器学习引擎都提供了 Python 接口,而 Python 又是一个编码非常便利的语言,所以人工智能的主流语言还是 Python。说了这么多,好像和 C++没什么事儿,实际上机器学习引擎都是 C/C++语言编写,相对于 Python 来说运行速度快很多,但编码要麻烦一些,所以 C/C++相关的人工智能开发一般是特定功能或者特定设备上做的开发,
一般都是为了使软件运行更流畅而采用 C/C++来编写
3.2 知识储备
其次是知识储备技能。人工智能是一门综合性的科学技术,要想理解人工智能中的相关特性原理和优化相关功能,那就不得不掌握高等数学、概率论、线性代数等基本的数学知识。拥有良好的数学基础,有利于在后续学习使用中更好的理解机器学习和深度学习的相关算法内容。同时对于 AI 研究尤为重要,例如人工智能中的智能很大一部分依托“概率论”实现的。
3.3 算法应用
再是必要的算法掌握。在机器学习、深度学习中,更多的是利用算法去分析数据、学习数据,然后对现实世界的情况作出判断和预测。包含必要的数据清洗、特征提取与选择、回归算法、决策树、随机森林法、马尔科夫模型等常用算需要有一定的了解。
3.4 综合应用
最后是项目实战。任何一门语言、一门技术,都需要不断的磨练。例如做图像处理的时候,比如检测人脸,具体使用什么语言去开发,Camera 的像素要求是多少、对于光线有什么要求、如何进行人脸快速检测、如何避免漏检等诸多因素,这些都需要不断的实践才能提升自己的实战能力。提升自己的创新思维,增强自己的实战能力,例如驾考的时候,一般需要人证统一,避免替考的情况,我们就可以做一个人脸识别系统,手持身份证进行刷卡,将身份信息和人脸信息进行比对,避免替考作弊的嫌疑。也就是自己想一些场景,然后自己去实现,提升自己的想象能力、动手能力、知识的运用能力。
4 环境搭建
人工智能开发的环境比较多,主要看具体的应用。例如做 Android 应用相关的人工智能开发,那么Android 开发环境就是人工智能开发环境的重要部分;如果在 Windows 做人工智能相关应用,例如人脸识别,那么 Windows 上安装相关环境就是重要部分了。不论是什么应用领域,人工智能开发都离不开 Linux,相关框架、别人的案例以 Linux 最为主流,例如使用 Ubuntu 开发的一个案例,需要在 Windows 上完成,
这将是一个非常巨大的工作量。本次课程采用linux开发板就讲述一下 ARM 上的基本环境搭建。
4.1 操作系统选择
人工智能开发最常用的是 Linux 系统,其中以 Ubuntu 最为普遍。我发现做 Android 系统开发也是Ubuntu,看来 Ubuntu 是越来越香了。Ubuntu 提供了完备的软件仓库,可以轻松的安装各种库,让嵌入式开发不再为每个库的移植花费大量的时间。对于我司的 A 系列教学平台是否可以移植 Ubuntu 系统呢?目前,i.MX8 均提供了 Ubuntu 系统,本实验指导书主要针对 i.MX6 和 i.MX8 编写,在 Ubuntu 系统的加持下,让 i.MX6 和 i.MX8 等 CortexA 处理器像 PC 一样工作,让 ARM 端的人工智能开发变得更简单,为开发者省去大量的基础工作。
❖ TensorFlow
TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个 CPU(或 GPU),服务器,移动设备等等。TensorFlow 最初由 Google 大脑小组(隶属于 Google 机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。
数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistentvariable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size 可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
❖ Keras
Keras 是基于 Python 的深度学习库,提供高层神经网络 API。Keras 由纯 Python 编写而成,并基于Tensorflow、Theano 以及 CNTK 作为后端。Keras 为支持快速实验而生,能够把你的 idea 迅速转换为结果,
如果你有如下需求,请选择 Keras:
⚫ 简易和快速的原型设计(keras 具有高度模块化,极简,和可扩充特性)
⚫ 支持 CNN 和 RNN,或二者的结合
⚫ 无缝 CPU 和 GPU 切换
Keras 适用的 Python 版本是:Python 2.7-3.6。
Keras 的设计原则:
⚫ 用户友好:Keras 是为人类而不是天顶星人设计的 API。用户的使用体验始终是我们考虑的首要和中
心内容。Keras 遵循减少认知困难的最佳实践:Keras 提供一致而简洁的 API, 能够极大减少一般应用下用户的工作量,同时,Keras 提供清晰和具有实践意义的 bug 反馈。
⚫ 模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。
⚫ 易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得 Keras 更适合于先进的研究工作。