首页 > 编程知识 正文

caffe框架用什么语言,caffe框架创始人

时间:2023-05-05 17:17:11 阅读:187652 作者:3070

一.什么是Caffe

Caffe的全称应该是Convolutional Architeure for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,它是开源的,核心语言是C++,他支持命令行、Python和Matlab接口,它既可以在CPU上运行也可以在GPU上运行。它的liense是BSD 2-Clause。

二.Caffe的特点 模块化:Caffe从一开始就设计得尽可能模块化,允许对新数据格式、网络层和损失函数进行扩展。表示和实现分离:Caffe的模型(model)定义是用Protocol Buffer语言写进配置文件的。以任意有向无环图的形式,Caffe支持网络架构。Caffe会根据网络的需要来正确占用内存。通过一个函数调用,实现CPU和GPU之间的切换。测试覆盖:在Caffe中,每一个单一的模块都对应一个测试。Python和Matlab接口:同时提供Python和Matlab接口。预训练参考模型:针对视觉项目,Caffe提供了一些参考模型,这些模型仅应用在学术和非商业领域,它们的license不是BSD。 三.Caffe的设计思想

基本上,Caffe沿用了神经网络的一个简单假设----所有的计算都是以layer的形式表示的,layer做的事情就是take一些数据,然后输出一些计算以后的结果,比如说卷积,就是输入一个图像,然后和这一层的参数(filter)做卷积,然后输出卷积的结果。每一个layer需要做两个计算:forward是从输入计算输出,然后backward是从上面给的gradient来计算相对于输入的gradient,只要这两个函数实现了以后,我们就可以把很多层链接层一个网络,这个网络做的事情就是输入我们的数据(图像、语音或者其他类型的数据),然后来计算我们需要的输出(比如说目标检测的label),在训练过程中,我们可以根据已有的label来计算loss和gradient,然后用gradient来update网络的参数,这个就是Caffe的一个基本流程。

基本上,最简单地用Caffe上手的方法就是先把数据写成Caffe的格式,然后设计一个网络,然后用Caffe提供的solver来做优化看效果如何,如果我们的数据是图像的话,可以从现有的网络,比如说AlexNet或者GoogleNet开始,然后做fine-tuning,如果我们的数据稍有不同,比如说是直接的float vector,我们可能需要做一些custom的configuration,Caffe的logistic regression example兴许会有帮助。

fine-tune方法:fine-tuning的想法就是说,在imagenet那么大的数据集上训练好一个很牛的网路,那别的任务上肯定也不错,所以我们可以把预训练的网络拿过来,然后只重新训练最后几层,重新训练的意思是说,比如我以前需要classify imagenet的一千类,现在我只想识别是狗还是猫,或者是不是手写体数字,于是我就可以把最后一层softmax从一个4096 * 1000的分类器变成一个4096 * 2的分类器,这个策略在应用中非常常见,所以我们经常会先在imagenet上pretrain一个网络,因为我们知道imagenet上training的大概过程会怎么样。

四.Caffe架构

Caffe的架构与其他的深度学习框架稍微不同,它没有根据算法实现过程的方式来进行编码,而是以系统级的抽象作为整体架构,逐层的封装实现细节,使得上层的架构变得很清晰。Caffe的整体架构如下:

1.SyncedMem

这个类的主要功能是封装CPU和GPU的数据交互操作。一般来说,数据的流动形式都是:硬盘–CPU内存–GPU内存–CPU内存–硬盘,所以在写代码的过程中经常会写CPU/GPU之间数据传输的代码,同时还要维护CPU和GPU两个处理端的内存指针。这些事情处理起来不会很难,但是会很繁琐。因此SyncedMem的出现就是把CPU/GPU的数据传输操作封装起来,只需要调用简单的接口就可以获得两个处理端同步后的数据。

2.Blob

Blob是用于存储数据的对象,在Caffe中各种数据(图像输入、模型参数)都是以Blob的形式在网络中传输的,Blob提供统一的存储操作接口,可用来保存训练数据、模型参数等,同时Blob还能在CPU和GPU之间进行同步以支持CPU/GPU的混合运算。

这个类做了两个封装:

操作数据的封装,使用Blob可以操纵高维的数据,快速访问其中的数据,变换数据的维度等。对原始数据和更新量的封装,每一个Blob中都有data和diff两个数据指针,data用于储存原始数据,diff用于存储反向传播(Backpropagation)的梯度更新值。Blob使用了SyncedMem,这样便于访问不同的处理端。Blob基本实现了整个Caffe数据结构部分的封装,在Net类中可以看到所有的前后向数据和参数都用Blob来表示就足够了。

数据的抽象到这里就可以了,接下来作层级的抽象。神经网络的前后向计算可以做到层与层之间完全独立,只要每个层按照一定的接口规则实现,就可以确保整个网络的正确性。

3.Layer

Layer是网络Net的基本单元,也是Caffe中能在外部进行调整的最小网络结构单元,每个Layer都有输入Blob和输出Blob。Layer(层)是Caffe中最庞大最繁杂的模块,它是神经网络的基本计算单元。由于Caffe强调模块化设计,因此只允许每个layer完成一类特定的计算,例如convolution操作、pooling、非线性变换、内积运算、以及数据加载、归一化和损失计算等。Caffe中layer的种类有很多,具体的种类及功能可以看看官方文档。在创建一个Caffe模型的时候,也是以Layer为基础进行的。Layer是一个父类,它的下面还有各种实现特定功能的字类,例如data_layer,conv_layer,loss_layer等。Layer是通过LayFactory来创建的。

4.Net

Net是一个完整的深度网络,包含输入层、隐藏层、输出层,在Caffe中一般是一个卷积神经网络(Convolution Neural Network, CNN)。通过定义不同类型的Layer,并用Blob将不同的Layer连接起来,就能产生一个Net。Net将数据Blob和层Layer组合起来做进一步的封装,对外提供了初始化和前后传播的接口,使得整体看上去和一个层的功能类似,但内部的组合可以是多种多样的。值得一提的是,每一层的输入输出数据统一保存在Net中,同时每个层内的参数指针也保存在Net中,不同的层可以通过参数共享来共享相同的参数,因此可以通过配置来实现多个神经网络层之间共享参数的功能。一个Net由多个Layer组成。一个经典的网络从data layer(从磁盘中载入数据)出发到loss layer结束。

5.Solver

有了Net就可以进行神经网络的前后向传播计算了,但是还缺少神经网络的训练和预测功能,Solver类进一步封装了训练和预测相关的一些功能。它还提供了两个接口:一个是更新参数的接口,继承了Solver可以实现不同的参数更新方法,如:Momentum,Nesterov,Adagrad等,因此可以使用不同的优化算法。另一个接口是训练过程中每一轮特定状态下的可注入的一些回调函数,在代码中这个回调点的直接使用者就是多GPU训练算法。Solver定义了针对Net网络模型的求解方法,记录网路的训练过程,保存网络模型参数,中断并恢复网络的训练过程。自定义Solver能够实现不同的神经网络求解方式。阅读Solver的代码可以了解网络的求解优化过程。Solver是一个父类,它下面还有实现不同优化方法的子类,例如:sgd_solver,adagrad_solver等,Solver是通过SolverFactory来创建的。

6.Proto

caffe.proto位于…/src/caffe/proto目录下,在这个文件夹下还有一个.pb.cc和一个.pb.h文件,这两个文件都是由caffe.proto编译而来的。在caffe.proto中定义了很多结构化数据,包括:BlobProto、Datum、FillerParameter、NetParameter、SolverParameter、SolverState、LayerParameter、ConcatParameter、ConvolutionParameter、DataParameter、DropoutParameter、HDF5DataParameter、HDF5OutputParameter、ImageDataParameter、InfogainLossParameter、InnerProductParameter、LRNParameter、MemoryDataParameter、PoolingParameter、PowerParameter、WindowDataParameter、V0LayerParameter。

7.IO

除了上面的知识外,还需要输入数据和参数。DataReader和DataTransformer帮助准备输入数据,Filler对参数进行初始化,一些Snapshot方法可以对模型进行持久化。

五.Caffe的接口

Caffe深度学习框架支持多种编程接口,包括命令行、Python和Matlab,下面将介绍如何使用这些接口。

1.Caffe Python接口

Caffe提供Python接口,即Pycaffe,具体实现在caffe、python文件夹内。在Python代码中import caffe,可以load models(导入模型)、forward and backward(前向、反向迭代)、handle IO(数据输入输出)、visualize networks(绘制net)和instrument model solving(自定义优化方法)。所有的模型数据、计算参数都是暴露在外、可供读写的。

caffe.Net:是主要接口,负责导入数据、校验数据、计算模型。caffe.Classifier:用于图像分类。caffe.Detector:用于图像检测。caffe.SGDSolver:是露在外的solver的接口。caffe.io:处理输入输出,数据预处理。caffe.draw:可视化net的结构。caffe.blobs:以numpy中ndarrys的形式表示,方便而且高效。 2.Caffe matlab接口

MATLAB接口(Matcaffe)在 caffe/matlab 目录的 caffe 软件包。在 matcaffe 的基础上,可将Caffe整合到MATLAB代码中。
MATLAB接口包括:

MATLAB 中创建多个网络结构。网络的前向传播(Forward)与反向传播(Backward)计算。网络中的任意一层以及参数的存取。网络参数保存至文件或从文件夹加载。blob 和 network 形状调整。网络参数编辑和调整。创建多个 solvers 进行训练。从solver 快照(Snapshots)恢复并继续训练。访问训练网络(Train nets)和测试网络(Test nets)。迭代后网络交由 MATLAB 控制。MATLAB代码融合梯度算法。 3.Caffe 命令行接口

命令行接口Cmdcaffe是Caffe中用来训练模型、计算得分以及方法判断的工具。Cmdcaffe存放在caffe/build/tools目录下。

1.caffe train

caffe train 命令用于模型学习,具体包括:

caffe tarin 带solver.prototxt 参数完成配置。caffe train 带 snapshot mode_iter_1000.solverstate参数加载solver snapshot。caffe train 带 weight参数model.caffemodel完成Fine-tuning模型初始化。 2.caffe test

caffe test 命令用于测试运行模型的得分,并且用百分比表示网络输出的最终结果,比如accuracyhuoloss作为其结果。测试过程中,显示每个batch的得分,最后输出全部batch的平均得分值。

3.caffe time

caffe time 命令用来检测系统性能和测量模型相对执行时间,此命令通过逐层计时与同步,执行模型检测。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。