TensorFlow深度学习应用开发实战(深度学习简介和开发环境搭建)

一、深度学习的发展及其应用

1.1 深度学习的发展历程

1956年,John McCarthy(约翰·麦卡锡)等人在美国达特茅斯学院(Dartmounth College)开会探讨如何使用机器模拟人的智能时,提出了“人工智能”这一概念。

这标志着人工智能学科的诞生,这一年也称为人工智能元年。

作为人工智能最重要的一个分支,深度学习近年来发展迅速,在国内外都引起了广泛的关注。

1.2 深度学习的起源阶段

1943年,心理学家Warren Mcculloch和数理逻辑学家Walter Pitts在合作的论文中提出并给出了人工神经网络的概念及人工神神经元的数学模型,从而开创了人类神经网络研究的时代。

1956年,心理学家Frank Rosenblatt受到这种思想的启发,认为这个简单想法足以创造一个可以学习识别物体的机器,并设计了算法和硬件。直到1957年,Frank Rosenblatt在《New York Times》上发表文章《Electronic ‘Brain’ Teaches Itself》,首次提出了可以模型人类感知能力的机器,并称之为感知机Perceptron

感知机是有单层计算单元的神经网络,由线性元件及阈值元件组成。感知机的逻辑图如图

1969年,美国数学家及人工智能先驱Marvin Minsky(马文·明斯基)在其著作中证明感知器本质上是一种线性模型,只能处理线性分类的问题,这使得神经网络的研究陷入近20年的停滞。

1.3 深度学习的发展阶段

沉寂了多年后,关于神经网络的研究开始慢慢复苏。

1986年,Geoffrey Hinton(杰弗里·辛顿)提出一种适用于多层感知器的反向传播算法———BP算法。

BP算法全称叫作误差反向传播(error Back Propagation,或者也叫作误差逆传播)算法。

其算法基本思想为:在前馈网络中,输入信号经输入层输入,通过隐层计算由输出层输出,输出值与标记值比较,若有误差,将误差反向由输出层向输入层传播,在这个过程中,利用梯度下降算法对神经元权值进行调整。

BP算法完美解决了非线性分类的问题,人人工神经网络再次引起人们广泛关注。

1989年,Robert Hecht-Nielsen(罗伯特·赫克特-尼尔森)证明了多层感知器的万能逼近原理。

此博文中介绍的论文是 1990 年 Le Page 组织的一个会议的 Invited paper.

  1. 一维阶梯函数的线性组合能逼近任何连续一维连续函数。

  2. Sigmoidal 函数可以逼近阶梯函数。因此,一维Sigmoidal函数的线性组合能逼近任何连续函数。

  3. 把坐标轴在R^{n}中沿各个方向旋转 (如同CT原理),在每一射线上,构造Sigmoidal函数的线性组合,就可以逼近R^{n}中任何连续函数。

  4. 优点:用一个简单到不能再简单的函数的线性组合和叠合可以逼近任何连续函数。

  5. 缺点:天下没有免费的午餐。

  6. 为了R^{n} 中函数达到精度1/N。需要识别 O(n^{N}) 个参数。这是无法承受的。

  7.  无论用阶梯函数还是Sigmoidal 函数,关键是利用其跳跃部分。因此,在用梯度法时,经常会发生导数不可控。

  8. 上述两个致命缺点长期阻碍了神经网络的发展和应用。深度学习就是围绕着这些问题来做的。通俗的讲,是实现神经网络逼近能力的技术

由于20世纪80年代计算机的硬件水平有限,运算能力跟不上,导致神经网络规模增大时使用BP算法出现了“梯度消失”问题,这导致BP算法的发展受到了限制,人工神经网络的发展再次进入到瓶颈期。

1.4 深度学习的爆发阶段

2006年是深度学习元年。这一年,Geoffey Hinton(杰弗里·辛顿)提出了深度学习的概念,并提出了深层网络训练中梯度消失问题的解决方案———通过无监督预训练对权值进行初始化,再加上有监督训练微调。

1、无监督预训练是用来训练的数据不包含输出目标,需要学习算法自动学习到一些有价值的信息。

2、有监督训练,又称监督学习,是一个机器学习中的方法,可以由训练资料中学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。训练资料是由输入物件(通常是向量)和预期输出所组成。函数的输出可以是一个连续的值(称为回归分析),或是预测一个分类标签(称作分类)。

2012年,Geoffey Hinton 课题组为了证明深度学习的潜力,首次参加ImageNet图像识别比赛,其构建的卷积神经网络模型AlexNet一举夺冠,且再分类准确率和分类速度上碾压第二名SVM(支持向量机模型)。

2014年,Facebook公司基于深度学习技术的DeepFace项目,在人脸识别方面的准确率已经达到97%以上,跟人眼识别的准确率几乎没有差别,再一次证明了深度学习算法在图像识别方面的领先性。

2016年,Google公司基于深度学习开发的AlphaGo以4:1的比分战胜了国际顶尖围棋高手李世石,使得深度学习在世界范围内再次掀起狂潮。

又一年,2017年,世界第一的中国棋手柯洁九段与AlphaGo进行对抗

1.5深度学习的应用领域

1、计算机视觉

1、什么是计算机视觉(Computer vision)?

  计算机视觉(Computer Vision),人靠视觉来做饭、越过障碍等等,Computer Vision就是让计算机有视觉,目的是让计算机看懂图像(image)和视频(video),手机或相机固然可以拍出很精细和细节的照片,比人看的远,清除,但是李飞飞教授说过:“

hear is the not the same as to listen, To take pictures is not the same as to see”,所以计算机视觉目的是看懂。

  -------看是很简单的,计算机比人更会看(image, video)

  -----我认为懂是让计算机能够在image和video中,根据人的命令来做相应的动作。就像人看懂一样,首先人要看到东西(image or video),然后大脑根据东西做出相关动作。由于计算机不能够像人一样global地分析image or video,所以我们要做image process :为存储、除数和表示而对image data进行处理,以便计算机自动理解。自动理解后,我们向其发送指令,它便可以和人一样。

2、自然语言处理

      自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分

1.6深度学习框架简介

1、TensorFlow

TensorFlow是一个开放源代码软件库,用于进行高性能数值计算。借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台(CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边缘设备等)。

ensorFlow 是一个用于研究和生产的开放源代码机器学习库。TensorFlow 提供了各种 API,可供初学者和专家在桌面、移动、网络和云端环境下进行开发。

TensorFlow是采用数据流图(data flow graphs)来计算,所以首先我们得创建一个数据流流图,然后再将我们的数据(数据以张量(tensor)的形式存在)放在数据流图中计算. 节点(Nodes)在图中表示数学操作,图中的边(edges)则表示在节点间相互联系的多维数据数组, 即张量(tensor)。训练模型时tensor会不断的从数据流图中的一个节点flow到另一节点, 这就是TensorFlow名字的由来。
张量(Tensor):张量有多种. 零阶张量为 纯量或标量 (scalar) 也就是一个数值. 比如 [1],一阶张量为 向量 (vector), 比如 一维的 [1, 2, 3],二阶张量为 矩阵 (matrix), 比如 二维的 [[1, 2, 3],[4, 5, 6],[7, 8, 9]],以此类推, 还有 三阶 三维的 …
张量从流图的一端流动到另一端的计算过程。它生动形象地描述了复杂数据结构在人工神经网中的流动、传输、分析和处理模式。

在机器学习中,数值通常由4种类型构成:
(1)标量(scalar):即一个数值,它是计算的最小单元,如“1”或“3.2”等。
(2)向量(vector):由一些标量构成的一维数组,如[1, 3.2, 4.6]等。
(3)矩阵(matrix):是由标量构成的二维数组。
(4)张量(tensor):由多维(通常)数组构成的数据集合,可理解为高维矩阵。

使用TensorFlow的优点主要表现在如下几个方面:

(1)TensorFlow有一个非常直观的构架,顾名思义,它有一个“张量流”。用户可以很容易地看到张量流动的每一个部分(借助TensorBoard,在后面的章节会有所提及)。

(2)TensorFlow可轻松地在CPU/GPU上部署,进行分布式计算。

(3)TensorFlow跨平台性高,灵活性强。TensorFlow不但可以在Linux、Mac和Windows系统下运行,甚至还可以在移动终端下工作。

当然,TensorFlow也有不足之处,主要表现在它的代码比较底层,需要用户编写大量的代码,而且很多相似的功能,用户还不得不“重造轮子”。但“瑕不掩瑜”,TensorFlow还是以雄厚技术积淀、稳定的性能,一骑红尘,“笑傲”于众多深度学习框架之巅。

2、Caffe

Caffe是一个深度学习框架,Caffe在BSD许可下开源,使用C++编写,带有Python接口。是贾扬清在加州大学伯克利分校攻读博士期间创建了Caffe项目。项目托管于GitHub,拥有众多贡献者。Caffe应用于学术研究项目、初创原型甚至视觉、语音和多媒体领域的大规模工业应用。雅虎还将Caffe与Apache Spark集成在一起,创建了一个分布式深度学习框架CaffeOnSpark。2017年4月,Facebook发布Caffe2,加入了递归神经网络等新功能。2018年3月底,Caffe2并入PyTorch。

特点

Caffe 完全开源,并且在有多个活跃社区沟通解答问题,同时提供了一个用于训练、测试等完整工具包,可以帮助使用者快速上手。此外 Caffe 还具有以下特点:

模块性:Caffe 以模块化原则设计,实现了对新的数据格式,网络层和损失函数轻松扩展。

表示和实现分离:Caffe 已经用谷歌的 Protocl Buffer定义模型文件。使用特殊的文本文件 prototxt 表示网络结构,以有向非循环图形式的网络构建。

Python和MATLAB结合: Caffe 提供了 Python 和 MATLAB 接口,供使用者选择熟悉的语言调用部署算法应用。

GPU 加速:利用了 MKL、Open BLAS、cu BLAS 等计算库,利用GPU实现计算加速。

结构

简单来讲,Caffe 中的数据结构是以 Blobs-layers-Net 形式存在。其中,Blobs 是通过 4 维向量形式(num,channel,height,width)存储网络中所有权重,激活值以及正向反向的数据。作为 Caffe 的标准数据格式,Blob 提供了统一内存接口。Layers 表示的是神经网络中具体层,例如卷积层等,是 Caffe 模型的本质内容和执行计算的基本单元。layer 层接收底层输入的 Blobs,向高层输出 Blobs。在每层会实现前向传播,后向传播。Net 是由多个层连接在一起,组成的有向无环图。一个网络将最初的 data 数据层加载数据开始到最后的 loss 层组合为整体。

3、PyTorch

PyTorch是一个的Python机器学习开源库,基于Torch,用于自然语言处理等应用程序。

2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络。

PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。它是由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。

PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用

优点:

  • PyTorch是相当简洁且高效快速的框架

  • 设计追求最少的封装

  • 设计符合人类思维,它让用户尽可能地专注于实现自己的想法

  • 与google的Tensorflow类似,FAIR的支持足以确保PyTorch获得持续的开发更新

  • PyTorch作者亲自维护的论坛 供用户交流和求教问题

  • 入门简单

4、MXNet

MXNet 是亚马逊(Amazon)选择的深度学习库。它拥有类似于 Theano 和 TensorFlow 的数据流图,为多 GPU 配置提供了良好的配置,有着类似于 Lasagne 和 Blocks 更高级别的模型构建块,并且可以在你可以想象的任何硬件上运行(包括手机)。对 Python 的支持只是其冰山一角—MXNet 同样提供了对 R、Julia、C++、Scala、Matlab,和 Javascript 的接口。

增强了sparse.dot运算符的性能。

MXNet自动设置OpenMP,以便在未设置NUM_OMP_THREADS时使用所有可用的CPU内核以最大限度地提高CPU利用率。

一元运算符和二元运算符可以避免在小型阵列上使用OpenMP,因为使用OpenMP实际上会损害多线程开销。

在CPU上显着提高了broadcast_add,broadcast_mul等的性能 。

使用NCCL 2.1版或更新版本时,建议将环境变量NCCL_LAUNCH_MODE设置为PARALLEL。

MXNet可以加速任何数值计算。神经网络中,每一层由一个线性函数和一个非线性变换组成。

开发环境搭建链接:

https://blog.csdn.net/weixin_45626468/article/details/114692986?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型

一、瀑布模型 1、按照传统的瀑布模型开发软件,有下述几个特点。 ①阶段间具有顺序性和依赖性 阶段间具有顺序性和依赖性,这个特点有两重含义: 1,必须等前一阶段的工作完成之后,才能开始后一阶段的工作;…

Linux基础命令(1)

1.强大好用的Shell Shell是一个命令工具。Shell(也称终端或壳)充当的是人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端,它会调用相应的程序服务去完成某些工作。 现在红帽系统在内的许多主流Lin…

软件工程(Rational统一过程)

Rational统一过程(Rational Unified Process,RUP)是由Rational软件公司推出的一种完整而且完美的软件过程。 RUP总结了经过多年商业化验证的六条最有效软件开发经验,这些经验被称为“最佳实践”。 1,最佳实践 (1&am…

软件工程(敏捷过程和极限编程)

1,敏捷过程 为了使软件开发团队具有高效工作和快速响应变化的能力,17位著名的软件专家于2001年2月联合起草了敏捷软件开发宣言。 敏捷软件开发宣言由下述4个简单的价值观声明组成。 (1)个体和交互胜过过程和工具 优秀的团队成…

软件工程(可行性研究讲解)

可行性研究 可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。(只是寻找客户所提需求的解决方案,能干还是不能干的问题。) 可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程。 GB…

软件工程(系统流程图讲解)

系统流程图是概括地模型物理系统的工具。 基本符号 系统符号 系统流程图的习惯画法是使信息在图中从顶向下或从左到右流动。 例子 某装配厂有一座存放零件的仓库,仓库中现有的各种零件的数量以及每种零件的库存量临界值等数据记录在库存清单主文件中。当仓库中零…

软件工程(数据流图)

数据流图有4种基本符号: 正方形或(立方体)表示数据的源点或者终点; 圆角矩形(或圆形)代表变换数据的处理; 开口矩形(或两条平行横县)代表数据存储; 箭头表…

Python二级笔记(10)

知识点: 1,线性表的链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以一般要多于顺序存储结构。 2,软件测试是为了发现错误而执行程序的过程,测试要以查找错误为中心。 3&#x…

Qt图形界面编程入门(6)

类的私有继承方式 ①基类公有成员和保护成员都作为私有成员被派生类继承,派生类自身的函数可直接访问他们,但是派生类对象则只能通过本类的公有函数间接地访问它们。 ②基类的私有成员成为派生类中更加封闭的私有成员,派生类内部成员函数也…

Qt图形界面编程入门(7)

派生类的构造函数和析构函数 基类的构造函数和析构函数不能被继承。 在派生类中,如果派生类新增的成员进行初始化,就必须加入新的构造函数。与此同时,对所有从基类继承下来的成员的初始化工作还是由基类的构造函数完成,必须在派…

Python二级笔记(11)

知识点: 1,在栈中,栈顶指针top动态反映了栈中元素的变化情况,在循环队列中,队尾指针和队头指针的动态变化决定队列的长度,在链式存储结构中.无论是循环链表还是线性链表,插入和删除元素时&…

Python二级笔记(12)

知识点: 1,机器周期的同步标准是指CPU访问存储器一次所需要的时间 2,int()函数可以将整数字符串转换成整数,也可以将浮点数转化为整数,但是不能将其他字符串转换成整数。 3,当max(函数的参数是字典时&am…

Python二级笔记(13)

知识点: 1,机器数,不管是正数还是负数,其补码的符号位取反即是偏移码。 2,循环队列是队列的一种顺序存储结构 3, break语句会跳出break所在的最内层循环; try中 的语句出错时会被捕获异常,执行except下的…

Python二级笔记(14)

知识点: 1,在循环链表中,只要指出表中任何一个结点的位置,就可以从它出发不重复地访问到表中其他所有的结点。 单向链表只有从头指针开始,沿各结点的指针扫描链表中的所有结点。 双向链表从任何一一个结点位置出发就可以访问到表中其他所有结…

Python二级笔记(15)

知识点: 1,数据流图(DFD)的作用是支持系统功能建模 2,一个数据库可以有多个外模型(也称子模式或用户模型),但概念模型和内模式(物理模式)只能有一个。 3&a…

Linux基础(管道符、重定向、转义字符与环境变量)

1、输入输出重定向 简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也…

软件工程(数据流图例题详解)

假设一家工厂的采购部每天需要一张订货报表,报表按零件编号排序,表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下述的数据:零件编号,零件名称,订货数量,目前价格,主要供…

软件工程(数据流图的命名、用途和自动化边界)

数据流图中每个成分的命名是否恰当,直接影响数据流图的可理解性。因此,给这些成分起名字时应该仔细推敲。 命名 1.为数据流(或数据存储)命名 (1)名字应代表整个数据流(或数据存储)的内容,而不是仅仅反映它的某些成分。 (2)不要使用空洞的…

Qt图形界面编程入门(Qt的历史、Qt安装资源链接、Qt Creator简介)

Qt的历史渊源 Qt是1991年由挪威的奇趣科技(Trolltech)公司开发的跨平台C图形用户界面(GUI)用程序开发框架,2008年,奇趣科技公司被诺基亚公可收购,Qt也因此成为诺基亚公司旗下的编程语言工具,曾称霸一时的Symbian手机操作系统就是…

Qt图形界面编程入门(创建一个简单的程序)

1,手工编码方式 利用手工编码方式建立“Hello Qt!”程序 第一步: 得到界面 2,无UI的向导方式 从图中,我们发现向导为窗口程序提供了3个基类,分别外QMainWindow、QWidget、QDialog,3个基类的区…