目前较为流行的三个深度学习框架:Caffe、TensorFlow、PyTorch.
一、Caffe的特点和概述、
1、Caffe简介
- Caffe(Convolutional Architecture for Fast Feature Embedding) (卷积神经网络框架)是一个深度学习框架,由Jia等人于2014年开发,并由伯克利视觉与学习中心开源。它主要用于图像识别、语音识别等领域的深度学习任务。caffe是一个清晰,可读性高,快速的深度学习框架。
- Caffe采用C++编写,具有高效的计算性能。它的设计灵感来自于神经科学的发现,将神经网络的各个层次以类似于人类大脑的方式进行连接和处理。Caffe支持多种深度学习架构,例如卷积神经网络(CNN)、循环神经网络(RNN)等,可以实现各种复杂的深度学习模型。
- Caffe是第一个主流的工业级深度学习工具,专精于图像处理。它有很多扩展,但是由于一些遗留的架构问题,不够灵活,且对递归网络和语言建模的支持很差。
- 对于基于层的网络结构, caffe扩展性不好;而用户如果想要增加层,则需要自己实现(forward,backward and gradient update)
2、Caffe的特点
- Caffe的基本工作流程是设计建立在神经网络的一个简单假设,所有的计算都是层的形式表示的,网络层所做的事情就是输入数据,然后输出计算结果。
- 以卷积为例,卷积就是输入一幅图像,然后和这一层的参数(flter)做卷积,最终输出卷积结果。每层需要两种函数计算,一种是forward,从输入计算到输出;另一种是backward,从上层给的gradient来计算相对于输入层的gradient.
- 这两个函数实现之后,我们就可以把许多层连接成一个网络,这个网络输入数据(图像,语音或其他原始数据),然后计算需要的输出(比如识别的标签)。在训练的时候,可以根据已有的标签计算loss和gradient, 然后用gradient来更新网络中的参数。
- Caffe是一个清晰而高效的深度学习框架,它基于纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口,可以在CPU和GPU直接无缝切换。它的模型与优化都是通过配置文件来设置,无须代码。
- Caffe设计之初就做到了尽可能的模块化,允许对数据格式、网络层和损失函数进行扩展。Caffe的模型定义是用Protocol Buffer(协议缓冲区)语言写进配置文件的,以任意有向无环图的形式。
- Caffe会根据网络需要正确占用内存,通过-个函数调用实现CPU和GPU之间的切换。Caffe每一个单一的模块都对应一个测试,使得测试的覆盖非常方便,同时提供python和matlab接口,用这两种语法进行调用都是可行的。
3.caffe的优点、缺点
优点:
- 高效性:Caffe是一个高效的深度学习框架,基于纯粹的C++/CUDA架构,可以在CPU和GPU之间无缝切换。
- 易用性:Caffe的模型与优化都是通过配置文件来设置,无需编写代码。支持命令行、Python和MATLAB接口,方便用户使用。
- 模块化:Caffe设计之初就做到了尽可能的模块化,允许对数据格式、网络层和损失函数进行扩展。
- 灵活性:Caffe的模型定义是用Protocol Buffer(协议缓冲区)语言写进配置文件的,以任意有向无环图的形式,具有很高的灵活性。
- 内存管理:Caffe会根据网络需要正确占用内存,通过一个函数调用实现CPU和GPU之间的切换。
- 测试方便:Caffe每一个单一的模块都对应一个测试,使得测试的覆盖非常方便。
缺点:
- 学习曲线:对于初学者来说,Caffe的学习曲线可能较陡峭,需要一定的时间来熟悉其配置和使用方法。
- 社区支持:相较于其他深度学习框架,如TensorFlow和PyTorch,Caffe的社区支持相对较弱,可能在遇到问题时寻找解决方案较为困难。
- 更新速度:Caffe的更新速度相对较慢,可能导致在某些方面的功能和性能上落后于其他主流深度学习框架。
- 依赖问题:Caffe依赖于一些较低的库版本,可能导致在安装和配置过程中遇到一些问题
4.caffe的概述
- Caffe是一种对新手非常友好的深度学习框架模型,它的相应优化都是以文本形式而非代码形式给出。Caffe中的网络都是有向无环图的集合,可以直接定义。
- 数据及其导数以blobs的形式在层间流动,Caffe层的定义由2部分组成:层属性与层参数,如图所示。
- 图中前4行是层属性,定义了层名称、层类型以及层连接结构(输入blob和输出blob); 而后半部分是各种层参数。Blob是用以存储数据的4维数组。
5.知识点补充
- 在神经网络和深度学习中,
forward
,backward
, 和gradient update
是三个关键的概念,它们构成了神经网络训练的基础,是深度学习中的标准流程,用于训练神经网络模型,以便它可以学习从输入数据到期望输出的映射。 - Forward Pass (前向传播):
- 这是神经网络处理输入并产生输出的过程。
- 在这个阶段,输入数据从输入层传递到隐藏层,最终到达输出层。
- 每个神经元会接收来自前一层的输入,将它们与权重相乘,加上偏置项,然后应用激活函数以生成输出,这个输出又作为下一层的输入。
- 对于卷积神经网络(CNN)中的卷积层,前向传播包括将输入图像与滤波器(或称为卷积核)进行卷积操作来提取特征。
- Backward Pass (反向传播):
- 在得到网络的输出后,需要通过比较预测值和实际值来计算误差(通常是使用损失函数,如交叉熵)。
- 反向传播的目的是根据输出误差来计算每层权重的梯度,即误差对权重的导数。
- 这个过程中,误差会从输出层反向传播至输入层,沿途计算每个权重参数相对于误差的梯度。
- 这些梯度指示了每个权重应该如何调整以减少误差。
- Gradient Update (梯度更新):
- 有了梯度信息后,就可以更新网络中的权重和偏置项,以便减少预测误差。
- 这通常涉及到选择一个学习率,然后用每个权重的梯度乘以学习率来确定权重应该更新多少。
- 更新规则通常遵循某种优化算法,例如随机梯度下降(SGD)、Adam或其他变体。
- 这个过程会在整个训练集中多次迭代进行,直到网络的性能达到满意的水平。
二、TensorFlow的特点和概述
1、什么是TensorFlow
- TensorFlow是一个保用数据流图(data flow graph)进行数值计算的开源软件库。节点(node)在数据流图中表示数学操作,线(edge)则表示在节点间相互联系的多维数据数组,即张(tensor).它灵活的架构让你可以在多种平台上展开计算。TensorFlow由Google大脑小组(隶属于Go0gle机器智能研究机构)的研究员和工程师们开发,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算算机中的领域。
2.数据流图
- 数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点”一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点"之间的输入/输出关系。这些数据“线"可以输运"size可动态调整”的多维数据数组,即“张量(tensor)。张量从图中流过的直观图像是这个工具取名为“TensorFlow" 的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
- 据流图用“结点”(nodes)和“线"(edges)的有向图来描述数学计算
- “节点”一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。
- “线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运"size可动态调整”的多维数据数组,即"张量”(tensor)。
- 张量从图中流过的直观图像是这个工具取名为"TensorFlow"的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
3.TensorFlow的特点
- 数据透明:基于梯度的机器学习算法会受益于TensorFlow自动求微分的能力。只需要定义预测模型的结构,将这个结构和目标函数(objective function)结合在一起,并添加数据TensorFlow将自动计算相关的微分导数。计算某个变量相对于其他变量的导数仅仅是通过扩展你的图来完成的,所以用户能一直清楚看到究竟在发生什么。
- 扩展便捷:·TensorFlow不是一个严格的“神经网络”库。只要用户可以将计算表示为一个数据流图就可以使用TensorFlow。用户负责构建图,描写驱动计算的内部循环。TensorFlow提供有用的工具来帮助用户组装“子图”,用户也可以在TensorFlow基础上写自己的“上层库”
·TensorFlow的可扩展性相当强,可以自己写一些C++ 码来丰富底层的操作。 - 界面交换:TensorFlow 还有一个合理的C++使用界面,也有一个易用的python使用界面来构建和执行你的graphs。你可以直接写python/Ct++程序,也可以用交互式的ipython界面来用TensorFlow尝试些想法,它可以帮用户将笔记、代码、可视化等有条理地归置好。
- 设备迁移:TensorFlow在CPU和GPU上运行,比如说可以运行在台式机、服务器、手机移动设备等等。TensorFlow支持将训练模型自动在多个CPU上规模化运算,以及将模型迁移到移动端后台。
4.TensorFlow的概述
- TensorFlow中Flow,也就是流,是其完成运算的基本方式。流是指一个计算图或简单的一个图,图不能形成环路,图中的每个节点代表一个操作,如加法、减法等。每个操作都会导致新的张量形成。
- 计算图具有以下属性:叶子顶点或起始顶点始终是张量。意即,操作永远不会发生在图的开头,由此可以推断,图中的每个操作都应该接受一个张量并产生一个新的张量。同样,张量不能作为非叶子节点出现,这意味着它们应始终作为输入提供给操作/节点。
- 计算图总是以层次顺序表达复杂的操作。通过将a+b表示为c,将b+1表示为d,可以分层次组织上述表达式。因此,可以将e写为:e=(c)x(d)这里c=a+b且d-b+1.以反序遍历图形而形成子表达式,这些子表达式组合起来形成最终表达式
- 当我们正向遍历时,遇到的顶点总是成为下-个顶点的依赖关系,例如没有a和b 就无法获得C,同样的,如果不解决c和d则无法获得e。同级节点的操作彼此独立,这是计算图的重要属性之一。
- 当我们按照图中所示的方式构造一个图时,很自然的是,在同一级中的节点,例如C和d,彼此独立,这意味着没有必要在计算d之前计算c。因此它们可以并行执行。
- 计算图的并行也是最重要的属性之一。它清楚地表明,同级的节点是独立的,这意味着在C被计算之前不需空闲,可以在计算C的同时并行计算d。TensorFlow充分利用了这个属性。
- TensorFlow允许用户使用并行计算设备更快地执行操作。计算的节点或操作自动调度进行并行计算。这一切都发生在内部,例如在上图中,可以在CPU上调度操作C,在GPU上调度操作d。下图展宗了两种分布式执行的过程。
- 上图中,第一种是单个系统分布式执行,其中单个TensorFlow会话创建单个worker, 并且该worker负责在各设备上调度任务。在第二种系统下,有多个worker,他们可以在同一台机器上或不同的机器上,每个worker都在自己的上下文中运行。在上图中,worker进程1运行在独立的机器上,并调度所有可用设备进行计算。
三、PyTorch的特点和概述
1.PyTorch简介
- PyTorch具有先进设计理念的框架,其历史可追溯到2002年就诞生于纽约大学的Torch。Torch使用了一种不是很大众的语言Lua作为接口。Lua简洁高效,但由于其过于小众,以至于很多人听说要掌握Torch必须新学一门语言就望而却步,但Lua其实是一门比Python还简单的语言。
- 考虑到Python在计算科学领域的领先地位,以及其生态完整性和接口易用性,几乎任何框架都不可避免地要提供Python接口。终于,在2017年,Torch的幕后团队推出了PyTorch。
- Py Torch不是简单地封装Lua, Torch提供Python接口,而是对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。
- PyTorch特点是拥有生态完整性和接口易用
性,使之成为当下最流行的动态框架之一。
2.PyTorch特点
- PyTorch既可以看作为加入了GPU支持的numpy。TensorFlow与Caffe都是命令式的编程语言,而且是静态的,即首先必须构建一个神经网络,然后一次又一次使用同样的结构;如果想要改变网络的结构,就必须从头开始。但是PyTorch通过一种反向自动求导的技术,可以让用户零延迟地任意改变神经网络的行为。
- PyTorch的设计思路是线性、直观且易于使用的,当用户执行一行代码时,它会忠实地执行,所以当用户的代码出现Bug的时候,可以通过这些信息轻松快捷地找到出错的代码,不会让用户在Debug的时候因为错误的指向或者异步和不透
明的引擎浪费太多的时间。 - PyTorch的代码相对于TensorFlow而言,更加简洁直观,同
时对于TensorFlow高度工业化的底层代码,PyTorch的源代
码就要友好得多,更容易看懂。深入API,理解PyTorch底层
肯定是一件令人高兴的事。
3.PyTorch概述
- PyTorch最大优势是建立的神经网络是动态的,可以非常容易的输出每一步的调试结果,相比于其他框架来说,调试起来十分方便。
- PyTorch的图是随着代码的运行逐步建立起来的,也就是说使用者并不需要在一开始就定义好全部的网络的结构,而是可以随着编码的进行来一点一点的调试,相比于TensorFlow和Caffe的静态图而言,这种设计显得更加贴近一般人的编码习惯。
4.PyTorch生态
- 尽管PyTorch发布较晚,但PyTorch仍然有着较为完备的生态环境。
不同应用领域对应的PyTorch库如表所示: - 对于计算机视觉,PyTorch有应用广泛的TorchVision库。
- 对于自然语言处理,PyTorch有PyTorch NLP、AllenNLP库。
- 对于图卷积这类新型图网络,有PyTorch Geometric库。
- 对于工业部署,ONN协议能保证模型的顺利部署。
- 对于上层API,基于PyTorch的Fastai框架相当简洁。
5.PyTorch优势
在众多的深度学习框架中,PyTorch是比较高速快捷简单易学的框架。
该框架同时具备了简洁、速度、易用、拥有活跃的社区和使用动态方法计算等特点。
1.简洁·
- 简洁的好处就是代码易于理解。
- PyTorch的设计追求最少的封装。
- ·遵循着tensor-variable(autograd)→nn.Mondule三个由低到高的抽象层次,分别代表高维数组(张量)、自动求导(变量)和神经网络。
- ·而且这三个抽象之间关系紧密,可以同时进行修改和操作。
2.速度
- PyTorch的灵活性不以牺牲速度为代价,在很多评测中,PyTorch的速度表现胜过TensorFlow和Keras等框架。
3.易用
- PyTorch是面向对象设计的。
- PyTorch的面向对象的接口设计来源于Torch,而Torch的接口设计以灵活易用而著称。
- PyTorch继承了Torch的优点,使得其符合程序员的设计思维。
4.活跃的社区
- PyTorch提供了完整的学习文档,开发人员在论坛及时和用户交流。
- 谷歌人工智能研究院对PyTorch提供了强大的技术支持,不会出现昙花一现的局面。
5.使用动态方法
- 动态方法使得PyTorch的调试相对简单。
- 模型中的每一个步骤、每一个流程都可以被使用者轻松地控制、调试、输出。
- 在PyTorch推之后,各类深度学习问题都有利用PyTorch实现的解决方案。
- PyTorch正在受到越来越多人的喜爱。
- 当然,现如今任何一个深度学习框架都有其缺点,PyTorch也不例外,对比TensorFlow其全面性能处于劣势。
- 目前PyTorch还不支持快速傅里叶、沿维翻转张量和检查无穷与非数值张量。·针对移动端、嵌入式部署以及高性能服务器端的部署,其性能表现有待提升。