caffe深度学习计算框架

Asu_PC Asu_PC     2022-10-06     322

关键词:

Caffe | Deep Learning Framework是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的 Yangqing Jia,目前在Google工作。Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换:

1 Caffe::set_mode(Caffe::GPU);

Caffe的优势

    1. 上手快:模型与相应优化都是以文本形式而非代码形式给出。 Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。
    2. 速度快:能够运行最棒的模型与海量的数据。 Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms.

    3. 模块化:方便扩展到新的任务和设置上。 可以使用Caffe提供的各层类型来定义自己的模型。

    4. 开放性:公开的代码和参考模型用于再现。
    5. 社区好:可以通过BSD-2参与开发与讨论

Caffe的网络定义

  Caffe中的网络都是有向无环图的集合,可以直接定义:数据以blobs的形式在层间流动。

1 name: "dummy-net"
2 
3 layers {<span><span>name: <span>"data" …</span></span></span>}
4 
5 layers {<span><span>name: <span>"conv" …</span></span></span>}
6 
7 layers {<span><span>name: <span>"pool" …</span></span></span>}
8 layers {<span><span>name: <span>"loss" …</span></span></span>} 

Caffe的各层定义

  Caffe层的定义由2部分组成:层属性与层参数,例如

 1 name:"conv1"
 2 type:CONVOLUTION
 3 bottom:"data"
 4 top:"conv1"
 5 convolution_param{
 6     num_output:<span>20
 7     kernel_size:5
 8     stride:1
 9     weight_filler{
10          type: "<span style="color: #c0504d;">xavier</span>"
11     }
12 }

Caffe的总体架构

  Caffe框架主要有五个组件,Blob,Solver,Net,Layer,Proto,其结构图如下图1所示。Solver负责深度网络的训练,每个Solver中包含一个训练网络对象和一个测试网络对象。每个网络则由若干个Layer构成。每个Layer的输入和输出Feature map表示为Input Blob和Output Blob。Blob是Caffe实际存储数据的结构,是一个不定维的矩阵,在Caffe中一般用来表示一个拉直的四维矩阵,四个维度分别对应Batch Size(N),Feature Map的通道数(C),Feature Map高度(H)和宽度(W)。Proto则基于Google的Protobuf开源项目,是一种类似XML的数据交换格式,用户只需要按格式定义对象的数据成员,可以在多种语言中实现对象的序列化与反序列化,在Caffe中用于网络模型的结构定义、存储和读取。

Blob

  下面介绍Caffe中的基本数据存储类Blob。Blob常用的存储格式:

1 图像数量N * 通道K * 图像高度H * 图像宽度W

  Blob使用SyncedMemory类进行数据存储并同步CPU和GPU上的数据,数据成员 data_指向实际存储数据的内存或显存块,shape_存储了当前blob的维度信息,diff_这个保存了反向传递时候的梯度信息。在Blob中其实不是只有num,channel,height,width这种四维形式,它是一个不定维度的数据结构,将数据展开存储,而维度单独存在一个vector<int> 类型的shape_变量中,这样每个维度都可以任意变化。来一起看看Blob的关键函数,data_at这个函数可以读取的存储在此类中的数据,diff_at可以用来读取反向传回来的误差。顺便给个提示,尽量使用data_at(const vector<int>& index)来查找数据。Reshape函数可以修改blob的存储大小,count用来返回存储数据的数量。BlobProto类负责了将Blob数据进行打包序列化到Caffe的模型中。

  Blob可根据CPU主机到GPU设备的同步需要,屏蔽CPU/GPU混合运算在计算上的开销。主机和设备上的内存按需求分配,已提高内存的使用率。使用GPU时,Caffe中CPU代码先从磁盘中加载数据到blob,同时请求先分配一个GPU设备核以使用GPU进行计算,再将计算好的blob数据送入到下一层,只要所有的layers均有GPU实现,这种情况下所有的中间数据都会保留在GPU上。

  这里一个实例,用以确定blob何时回复制数据:

 1 // 假定数据在 假定数据在 CPU上进行初始化,我们有一个blob 
 2 const Dtype* foo; 
 3 Dtype* bar; 
 4 foo = blob.gpu_data(); // 数据从CPU复制到 复制到 GPU
 5 foo = blob.cpu_data(); // 没有数据复制,两者都最新的内容 
 6 bar = blob.mutable_gpu_data(); // 没有数据复制
 7 // ... 一些操作 ... 
 8 bar = blob.mutable_gpu_data(); // 仍在GPU,没有数据复制
 9 foo = blob.cpu_data(); //由于GPU修改了数值,数据从GPU复制到 CPU
10 foo = blob.gpu_data(); //没有数据复制,两者都最新的内容
11 bar = blob.mutable_cpu_data(); // 依旧没有数据复制
12 bar = blob.mutable_gpu_data(); //数据从CPU复制到GPU
13 bar = blob.mutable_cpu_data(); //数据从GPU复制到CPU

 

Solver

  Solver通过协调Net的前向计算和反向梯度计算来进行参数更新,从而达到loss的目的。目前Caffe的模型学习分为两个部分:由Solver进行优化、更新参数;由Net计算出loss和gradient。solver具体的工作:1、用于优化过程的记录,创建训练网络和测试网络。2、用过forward和backward过程来迭代优化更新参数。3、周期性的用测试网络评估模型性能。4、优化过程中记录模型和solver状态的快照。一些参数的配置都在solver.prototxt格式的文件中:

 1 1. ####训练样本###
 2 
 3 总共:121368个
 4 batch_szie:256
 5 将所有样本处理完一次(称为一代,即epoch)需要:121368/256=475 次迭代才能完成
 6 所以这里将test_interval设置为475,即处理完一次所有的训练数据后,才去进行测试。所以这个数要大于等于475.
 7 如果想训练100代,则最大迭代次数为47500;
 8 2. ####测试样本###
 9 同理,如果有1000个测试样本,batch_size为25,那么需要40次才能完整的测试一次。 所以test_iter为40;这个数要大于等于40.
10 3. ####学习率###
11 学习率变化规律我们设置为随着迭代次数的增加,慢慢变低。总共迭代47500次,我们将变化5次,所以stepsize设置为47500/5=9500,即每迭代9500次,我们就降低一次学习率。
12 
13  ####参数含义#############
14 
15 net: "examples/AAA/train_val.prototxt"   #训练或者测试配置文件
16 test_iter: 40   #完成一次测试需要的迭代次数
17 test_interval: 475  #测试间隔
18 base_lr: 0.01  #基础学习率
19 lr_policy: "step"  #学习率变化规律
20 gamma: 0.1  #学习率变化指数
21 stepsize: 9500  #学习率变化频率
22 display: 20  #屏幕显示间隔
23 max_iter: 47500 #最大迭代次数
24 momentum: 0.9 #动量
25 weight_decay: 0.0005 #权重衰减
26 snapshot: 5000 #保存模型间隔
27 snapshot_prefix: "models/A1/caffenet_train" #保存模型的前缀
28 solver_mode: GPU #是否使用GPU
29 
30 stepsize不能太小,如果太小会导致学习率再后来越来越小,达不到充分收敛的效果。

  接下来我们看看Solver这个优化对象在Caffe中是如何实现的。SolverRegistry这个类就是我们看到的上面的factory类,负责给我们一个优化算法的产品,外部只需要把数据和网络结构定义好,它就可以自己优化了。Solver* CreateSolver(const SolverParameter& param)这个函数就是工厂模式下的CreateProduct的操作

  接下里我们看看Solver中的关键函数。Solver中Solve函数的流程图如下:

      

  Solver类中Step函数流程图:

        

  Solver中关键的就是调用Sovle函数和Step函数的流程,你只需要对照Solver类中两个函数的具体实现,看懂上面两个流程图就可以理解Caffe训练执行的过程了。

Net

  Net是由一些列层组成的有向无环图DAG,一个典型的Net开始于data layer ----> 从磁盘中加载数据----> 终止于loss layer。(计算和重构目标函数。)这个是我们使用Proto创建出来的深度网络对象,这个类负责了深度网络的前向和反向传递。以下是Net类的初始化方法NetInit函数调用流程:

    

  类中的关键函数简单剖析

    1).ForwardBackward:按顺序调用了Forward和Backward。

    2).ForwardFromTo(int start, int end):执行从start层到end层的前向传递,采用简单的for循环调用。,forward只要计算损失loss

    3).BackwardFromTo(int start, int end):和前面的ForwardFromTo函数类似,调用从start层到end层的反向传递。backward主要根据loss来计算梯度,caffe通过自动求导并反向组合每一层的梯度来计算整个网络的梯度。

    4).ToProto函数完成网络的序列化到文件,循环调用了每个层的ToProto函数。

  Net::Init()进行模型的初始化。初始化主要实现两个操作:创建blobs和layers以搭建整个DAG网络,并且调用layers的SetUp()函数。

Layer

  Layer是Net的基本组成单元,例如一个卷积层或一个Pooling层。本小节将介绍Layer类的实现。

  • NeuronLayer类:定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(比如Dropout运算,激活函数ReLu,Sigmoid等),运算均为同址计算(in-place computation,返回值覆盖原值而占用新的内存)。
  • LossLayer类:定义于loss_layers.hpp中,其派生类会产生loss,只有这些层能够产生loss。
  • 数据层:定义于data_layer.hpp中,作为网络的最底层,主要实现数据格式的转换。
  • 特征表达层(我自己分的类):定义于vision_layers.hpp,实现特征表达功能,更具体地说包含卷积操作,Pooling操作,他们基本都会产生新的内存占用(Pooling相对较小)。
  • 网络连接层和激活函数(我自己分的类):定义于common_layers.hpp,Caffe提供了单个层与多个层的连接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer类

Layer的重要成员函数

  layer主要定义了三种运算,setup,forward,backward

  在Layer内部,数据主要有两种传递方式,正向传导(Forward)和反向传导(Backward)。Forward和Backward有CPU和GPU(部分有)两种实现。Caffe中所有的Layer都要用这两种方法传递数据。Layer类派生出来的层类通过实现这两个虚函数,产生了各式各样功能的层类。Forward是从根据bottom计算top的过程,Backward则相反(根据top计算bottom)。注意这里为什么用了一个包含Blob的容器(vector),对于大多数Layer来说输入和输出都各连接只有一个Layer,然而对于某些Layer存在一对多的情况,比如LossLayer和某些连接层。在网路结构定义文件(*.proto)中每一层的参数bottom和top数目就决定了vector中元素数目。

1 layers {
2     bottom: "decode1neuron" // 该层底下连接的第一个Layer
3     bottom: "flatdata" // 该层底下连接的第二个Layer
4     top: "l2_error" // 该层顶上连接的一个Layer
5     name: "loss" // 该层的名字 type: EUCLIDEAN_LOSS //该层的类型
6     loss_weight: 0
7 }

 

 

 

 

深度学习—caffe框架训练文档

转存:LMDBE:机器学习2caffe资料caffe_rootcaffe-masterBuildx64Release>convert_imageset.exeE:/机器学习2/caffe资料/caffe_root/caffe-master/examples/myfile/trainE:/机器学习2/caffe资料/caffe_root/caffe-master/examples 查看详情

caffe深度学习框架上手教程

Caffe深度学习框架上手教程   blink15年1月 Caffe(CNN,deeplearning)介绍Caffe-----------ConvolutionArchitectureForFeatureEmbedding(Extraction)Caffe是什么东东?CNN(DeepLearning)工具箱C++语言架构CPU和GPU无缝交换Python和 查看详情

caffe深度学习框架介绍

...自:http://suanfazu.com/t/caffe/281 Caffe是一个清晰而高效的深度学习框架,其作者是博士毕业于UCBerkeley的贾扬清,目前在Google工作。Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换: Caffe::... 查看详情

ubuntu14.04安装caffe深度学习框架

简介:如何在ubuntu14.04下安装caffe深度学习框架。注:安装caffe时一定要保持网络状态好,不然会遇到很多麻烦。例如下载不了,各种报错。一、安装依赖包$sudoapt-getinstallgit$sudoapt-getinstalllibprotobuf-devlibleveldb-devlibsnappy-devlibopencv-dev... 查看详情

深度学习框架caffe在macosheighsierra上安装过程实录

第一步、安装依赖库brewinstall-vdsnappyleveldbgflagsglogsziplmdbbrewtaphomebrew/sciencebrewinstallhdf5opencvbrewinstallprotobufboost 第二步、编译caffegitclonehttps://github.com/BVLC/caffe.gitcdcaffemakeall&& 查看详情

主流的深度学习框架基本知识

...章内容1、TensorFlow2、Keras3、MXNet4、CNTK5、PyTorch 常见的深度学习框架常见的深度学习框架有TensorFlow、Caffe、Theano、Keras、PyTorch、MXNet等,如下图所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信... 查看详情

基于opengles的深度学习框架编写

基于OpenGLES的深度学习框架编写背景与工程定位背景项目组基于深度学习实现了视频风格化和人像抠图的功能,但这是在PC/服务端上跑的,现在需要移植到移动端,因此需要一个移动端的深度学习的计算框架。同类型的库caffe-andr... 查看详情

感悟:微博深度学习平台架构和实践

TensorFlow、Caffe和MXNet是三大主流的深度学习开源框架:TensorFlow的优势是社区最活跃,开源算法和模型最丰富;Caffe则是经典的图形领域框架,使用简单,在科研领域占有重要地位;MXNet在分布式性能上表现优异。PaddlePaddle、鲲鹏... 查看详情

贾扬清:希望caffe成为深度学习领域的hadoop

【转:http://www.csdn.net/article/2015-07-07/2825150】在深度学习(DeepLearning)的热潮下,Caffe作为一个高效、实用的深度学习框架受到了广泛的关注。了解Caffe研发的背景、愿景、技术特色、路线图及其开发者的理念,对于我们选择合适... 查看详情

深度学习框架指南

前言本文介绍深度学习的框架指南,基本是免费和开源的。包括:Keras、PyTorch、TensorFlow、Theano、MXNet、Caffe2、CNTK、Chainer等。文章结构分为“目录版”和“简介版”。目录前言一、目录版1.1 Keras1.2 PyTorch1.3TensorFlow1.4Theano1... 查看详情

20170122-dev-install-caffe(代码片段)

layouttitlecategoriestagsdatedescriptionpost深度学习:玩转caffe之安装blogframeworktools2017-01-2212:20:20-0800CaffeinstallinUbuntuCaffe安装初探引言做深度学习,没用玩过深度学习框架caffe就有点说不过去了。虽然自己的小机器显卡计算能力很... 查看详情

caffe框架

深度学习框架Caffe:         神奇且强大的Caffe:                           在GitHub上有一个小社区:ModelZoo             Caffe官网:  ... 查看详情

问题集录--tensorflow深度学习

 TensorFlow深度学习框架Google不仅是大数据和云计算的领导者,在机器学习和深度学习上也有很好的实践和积累,在2015年年底开源了内部使用的深度学习框架TensorFlow。与Caffe、Theano、Torch、MXNet等框架相比,TensorFlow在Github上Fork... 查看详情

深度学习及机器学习框架对比摘要

对比深度学习十大框架:TensorFlow并非最好?TensorFlow与主流深度学习框架对比五大主流深度学习框架对比:MXNET是最好选择主流开源深度学习框架对比分析主流深度学习框架对比深度学习框架的评估与比较几种机器学习框架的对... 查看详情

《深度学习与计算机视觉算法原理框架应用》pdf+《深度学习之pytorch实战计算机视觉》pdf

下载:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w《深度学习与计算机视觉算法原理、框架应用》PDF,带书签,347页。《大数据架构详解:从数据获取到深度学习》PDF,带书签,373页。配套源代码。下载:https://pan.baidu.com/s/1P0-o29x0ZrXp8Wo... 查看详情

人工智能,深度学习

1.人工智能的核心--》机器学习--》深度学习--》神经网络 2.深度学习的工作流程:a。训练样本b。特征抽取c。学习函数d。预测 3.人工智能的运用范围:自然语言处理;计算机视觉等 4.深度学习的框架:a。caffe:不需要... 查看详情

caffe2现已并入pytorch?真的假的

...   文 |小象君近日,GitHub发布一则通知,深度学习框架Caffe现已将代码并入了PyTorch。Caffe(卷积神经网络框架),全称ConvolutionalArchitectureforFastFeatureEmbedding。是一种常用的深度学习框架,在视频、图像处理方面应用... 查看详情

开篇词:基于java的深度学习框架及其生态圈

随着深度学习在语音、图像、自然语言等领域取得了广泛的成功,越来越多的企业、高校和科研单位开始投入大量的资源研发AI项目。同时,为了方便广大研发人员快速开发深度学习应用,专注于算法应用本身,避免重复造轮子... 查看详情