caffe网络模型各层详解.docx

上传人:小飞机 文档编号:4883389 上传时间:2023-05-21 格式:DOCX 页数:25 大小:174.55KB
返回 下载 相关 举报
caffe网络模型各层详解.docx_第1页
第1页 / 共25页
caffe网络模型各层详解.docx_第2页
第2页 / 共25页
caffe网络模型各层详解.docx_第3页
第3页 / 共25页
caffe网络模型各层详解.docx_第4页
第4页 / 共25页
caffe网络模型各层详解.docx_第5页
第5页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《caffe网络模型各层详解.docx》由会员分享,可在线阅读,更多相关《caffe网络模型各层详解.docx(25页珍藏版)》请在三一办公上搜索。

1、一.数据层及参数要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等,而一个 模型由多个屋(layer)构成,每一屋又由许多参数组成。所有的参数都定义在caffe.proto 这个文件中。要熟练使用caffe,最重要的就是学会配置文件(prototxt)的编写。层有很多种类型,比如Data,Convolution,Pooling等,层之间的数据流动是以Blobs 的方式进行。今天我们就先介绍一下数据层.数据层是每个模型的最底层,是模型的入口,不仅提供数据的输入,也提供数据从Blobs 转换成别的格式进行保存输出。通常数据的预处理(如减去均值,放大缩小,裁剪和镜

2、像 等),也在这一层设置参数实现。数据来源可以来自高效的数据库(如LevelDB和LMDB),也可以直接来自于内存。如 果不是很注重效率的话,数据也可来自磁盘的hdf5文件和图片格式文件。所有的数据层的都具有的公用参数:先看示例layer name: cifar”type: Datatop: datatop: labelinclude phase: TRAINtransform_param mean_file: examples/cifarlO/mean.binaryproto”data_param source: examples/cifar10/cifar10_train_lmdbbatc

3、h_size: 100backend: LMDBname:表示该层的名称,可随意取type:层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同, 数据层的类型也不同(后面会详细阐述)。一般在练习的时候,我们都是采用的LevelDB 或LMDB数据,因此层类型设置为Data。top或bottom:每一层用bottom来输入数据,用top来输出数据。如果只有top没有 bottom,则此层只有输出,没有输入。反之亦然。如果有多个top或多个bottom,表示有 多个blobs数据的输入和输出。data与label:在数据层中,至少有一个命名为data的top。如果有

4、第二个top,-般 命名为label。这种(data,label)配对是分类模型所必需的。include:般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于 训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数, 则表示该层既在训练模型中,又在测试模型中。Transformations:数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255,即将输入数据由0-255归一化到0-1之间其它的数据预处理也在这个地方设置:transform_param scale: 0.00390625mea

5、n_file_size: examples/cifar10/mean.binaryproto#用一个配置文件来进行均值操作mirror: 1 # 1表示开启镜像,0表示关闭,也可用ture和false来表示#剪裁一个227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪 crop_size: 2271、数据来自于数据库仗口 LevelDB和LMDB)层类型(layer type) :Data必须设置的参数:source:包含数据库的目录名称,如 examples/mnist/mnist_train_lmdbbatch_size:每次处理的数据个数,如64可选的参数:rand_skip:

6、在开始的时候,路过某个数据的输入。通常对异步的SGD很有用。backend:选择是采用LevelDB还是LMDB,默认是LevelDB.示例:layer name: mnist”type: Datatop: datatop: labelinclude phase: TRAINtransform_param scale: 0.00390625data_param source: examples/mnist/mnist_train_lmdbbatch_size: 64backend: LMDB2、数据来自于内存层类型:MemoryData必须设置的参数:batch_size :每一次处理的数据个

7、数,比如2channels :通道数height:高度width:宽度示例:layer top: data”top: labelname: memory_datatype: MemoryDatamemory_data_parambatch_size: 2height: 100width: 100channels: 1transform_param scale: 0.0078125mean_file: mean.protomirror: false3、数据来自于5层类型:HDF5Data必须设置的参数:source:读取的文件名称batch_size:每一次处理的数据个数示例:layer nam

8、e: datatype: HDF5Datatop: datatop: labelhdf5_data_param source: examples/hdf5_classification/data/train.txt”batch_size: 104、数据来自于图片层类型:ImageData必须设置的参数:source:一个文本文件的名字,每一行给定一个图片文件的名称和标签(label)batch_size:每一次处理的数据个数,即图片数可选参数:rand_skip:在开始的时候,路过某个数据的输入。通常对异步的SGD很有用。shuffle:随机打乱顺序,默认值为falsenew_height,n

9、ew_width:如果设置,则将图片进行resize示例:layer name: data”type: ImageDatatop: datatop: labeltransform_param mirror: false crop_size: 227 mean_file: data/ilsvrc12/imagenet_mean.binaryproto”image_data_param source: examples/_temp/file_list.txt” batch_size: 50 new_height: 256 new_width: 256 5、数据来源于Windows层类型:Windo

10、wData必须设置的参数:source: 一个文本文件的名字batch_size:每一次处理的数据个数,即图片数示例:layer name: datatype: WindowDatatop: datatop: labelinclude phase: TRAINtransform_param mirror: true crop_size: 227 mean_file: data/ilsvrc12/imagenet_mean.binaryprotowindow_data_param source: examples/finetune_pascal_detection/window_file_200

11、7_trainval.txt batch_size: 128 fg_threshold: 0.5 bg_threshold: 0.5 fg_fraction: 0.25 context_pad: 16 crop_mode: warp二.视觉层(Vision Layers)及参数本文只讲解视觉层(Vision Layers)的参数,视觉层包括Convolution, Pooling, Local Response Normalization (LRN), im2c ol 等层。1、Convolution 层:就是卷积层,是卷积神经网络(CNN)的核心层。层类型:Convolutionlr_mul

12、t:学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的 base_lr。如果有两个lr_mult,则第一个表示权值的学习率,第二个表示偏置项的学习率。 一般偏置项的学习率是权值学习率的两倍。在后面的convolution_param中,我们可以设定卷积层的特有参数。必须设置的参数:num_output:卷积核(filter)的个数kernel_size:卷积核的大小。如果卷积核的长和宽不等,需要用kernel_h和 kernel_w分别设定 其它参数:stride:卷积核的步长,默认为1。也可以用stride_h和stride_w来设置。pad:扩充边缘,默认为0

13、,不扩充。扩充的时候是左右、上下对称的,比如卷积 核的大小为5*5,那么pad设置为2,则四个边缘都扩充2个像素,即宽度和高度都扩充了 4个像素,这样卷积运算之后的特征图就不会变小。也可以通过pad_h和pad_w来分别设定。weight_filler:权值初始化。默认为“constant”,值全为0,很多时候我们用 xavier”算法来进行初始化,也可以设置为” gaussianbias_filler:偏置项的初始化。一般设置为constant”,值全为0。bias_term:是否开启偏置项,默认为true,开启group:分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。

14、如果我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。输入:n*c0*w0*h0输出:n*c1*w1*h1其中,c1就是参数中的num_output,生成的特征图个数 w1=(w0+2*pad-kernel_size)/stride+1;h1=(h0+2*pad-kernel_size)/stride+1;如果设置stride为1,前后两次卷积部分存在重叠。如果设置pad=(kernel_size-1)/2,则 运算后,宽度和高度不变。示例:layer name: conv1type: Convolutionbottom: datatop: conv1param lr_

15、mult: 1param lr_mult: 2 convolution_param num_output: 20 kernel_size: 5 stride: 1 weight_filler 一 type: xavier bias_filler type: constant 2、Pooling 层也叫池化层,为了减少运算量和数据维度而设置的一种层。层类型:Pooling必须设置的参数:kernel_size:池化的核大小。也可以用kernel_h和kernel_w分别设定。 其它参数:pool:池化方法,默认为MAX。目前可用的方法有MAX, AVE,或STOCHASTICpad:和卷积层的p

16、ad的一样,进行边缘扩充。默认为0stride:池化的步长,默认为1。一般我们设置为2,即不重叠(步长二窗口大小)。也可 以用 stride_h 和 stride_w 来设置。示例:layer name: pool1type: Poolingbottom: conv1top: pool1pooling_param pool: MAX kernel_size: 3 stride: 2 pooling层的运算方法基本是和卷积层是一样的。 输入:n*c*w0*h0 输出:n*c*w1*h1和卷积层的区别就是其中的c保持不变w1=(w0+2*pad-kernel_size)/stride+1; h1=

17、(h0+2*pad-kernel_size)/stride+1;如果设置stride为2,前后两次卷积部分重叠。3、Local Response Normalization (LRN)层此层是对一个输入的局部区域进行归一化,达到“侧抑制”的效果。可去搜索AlexNet或 GoogLenet,里面就用到了这个功能层类型:LRN参数:全部为可选,没有必须local_size:默认为5。如果是跨通道LRN,则表示求和的通道数;如果是在通道内LRN, 则表示求和的正方形区域长度。alpha:默认为1,归一化公式中的参数。beta:默认为5,归一化公式中的参数。norm_region:默认为 ACROS

18、S_CHANNELS。有两个选择,ACROSS_CHANNELS 表示在相邻的 通道间求和归一化。WITHIN_CHANNEL表示在一个通道内部特定的区域内进行求和归一化。 与前面的local_size参数对应。后的输出示例:layers name: norm1type: LRN bottom: pool1 top: norm1 lrn_param local_size: 5 alpha: 0.0001 beta: 0.754、im2col 层如果对matlab比较熟悉的话,就应该知道im2col是什么意思。它先将一个大矩阵,重叠地 划分为多个子矩阵,对每个子矩阵序列化成向量,最后得到另外一个

19、矩阵。看一看图就知道了:在caffe中,卷积运算就是先对数据进行im2col操作,再进行内积运算(inner product)。这样做,比原始的卷积操作速度更快。看看两种卷积操作的异同:Traditional convolutionMatrixProductVersion of Convolution三激活层(Activiation Layers)及参数在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的。 从bottom得到一个blob数据输入,运算后,从top输入一个blob数据。在运算过程中, 没有改变数据的大小,即输入和输出的数据大小是相等的。输入:n*c*

20、h*w输出:n*c*h*w常用的激活函数有sigmoid, tanh,relu等,下面分别介绍。1、Sigmoid对每个输入数据,利用sigmoid函数执行操作。这种层设置比较简单,没有额外的参数。S滂层类型:Sigmoid示例:layer name: encode1neuronbottom: encode1top: encode1neurontype: Sigmoid”2、ReLU / Rectified-Linear and Leaky-ReLUReLU是目前使用最多的激活函数,主要因为其收敛更快,并且能保持同样效果。 标准的ReLU函数为max(x, 0),当x0时,输出x;当x=0时,

21、输出0 f(x)=max(x,0) 层类型:ReLU 可选参数: negative_slope:默认为 0.数据为负数时,就不再设置为0, layer name: relul type: ReLU bottom: pooll top: pooll RELU层支持in-place计算,对标准的ReLU函数进行变化,如果设置了这个值,那么 而是用原始数据乘以negative_slope这意味着bottom的输出和输入相同以避免内存的消耗。3、 TanH / Hyperbolic Tangent利用双曲正切函数对数据进行变换。1 sinhx 尸-extanh层类型:layer name:cosh 碎

22、 + exTanHlayer”bottom: intop: outtype: TanH4、Absolute Value求每个输入数据的绝对值。f(x)=Abs(x)层类型:AbsVallayer name: layerbottom: intop: outtype: AbsVal5、Power对每个输入数据进行幂运算f(x)= (shift + scale * x) power层类型:Power可选参数:power:scale:shift:layer 默认为1默认为1默认为0name: layer bottom: in top: out type: Power power_param 2 1 0

23、power:scale:shift:6、BNLLbinomial normal log likelihood 的简称f(x)=log(1 + exp(x)层类型:BNLLlayer name: layer”bottom: intop: outtype: “BNLL”四. 其它常用层及参数本文讲解一些其它的常用层,包括:softmax_loss层,Inner Product层,accuracy层, reshape层和dropout层及其它们的参数配置。1、softmax-losssoftmax-loss层和softmax层计算大致是相同的。softmax是一个分类器,计算的是类别的 概率(匚ik

24、elihood),是Logistic Regression 的一种推广。Logistic Regression 只能 用于二分类,而softmax可以用于多分类。softmax 与 softmax-loss 的区别:softmax计算公式:而softmax-loss计算公式:关于两者的区别更加具体的介绍,可参考:softmax vs. softmax-loss用户可能最终目的就是得到各个类别的概率似然值,这个时候就只需要一个Softmax层, 而不一定要进行softmax-Loss操作;或者是用户有通过其他什么方式已经得到了某种概率 似然值,然后要做最大似然估计,此时则只需要后面的softma

25、x-Loss而不需要前面的 Softmax操作。因此匕提供两个不同的Layer结构比只提供一个合在一起的Softmax-LossLayer要灵活许多。不管是softmax layer还是softmax-loss layer,都是没有参数的,只是层类型不同而也 softmax-loss layer :输出 loss 值 layer name: losstype: SoftmaxWithLossbottom: ip1bottom: labeltop: losssoftmax layer:输出似然值layers bottom: cls3_fctop: probname: probtype: “Sof

26、tmax2、Inner Product全连接层,把输入当作成一个向量,输出也是一个简单向量(把输入数据blobs的width 和height全变为1)。输入:n*c0*h*w输出:n*c1*1*1全连接层实际上也是一种卷积层,只是它的卷积核大小和原数据大小一致。因此它的参数基 本和卷积层的参数一样。层类型:InnerProductlr_mult:学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的 base_lr。如果有两个lr_mult,则第一个表示权值的学习率,第二个表示偏置项的学习率。 一般偏置项的学习率是权值学习率的两倍。必须设置的参数:num_output

27、:过滤器(filfter)的个数其它参数:weight_filler:权值初始化。默认为“constant”,值全为0,很多时候我们用xavier算法来进行初始化,也可以设置为” gaussianbias_filler:偏置项的初始化。一般设置为constant”,值全为0。bias_term:是否开启偏置项,默认为true,开启layer name:type:ip1InnerProductbottom: pool2top: ip1param lr_mult: 1param lr_mult: 2inner_product_param num_output: 500weight_filler 一

28、 type: xavierbias_filler type: constant3、accuracy输出分类(预测)精确度,只有test阶段才有,因此需要加入include参数。层类型:Accuracylayer name: accuracytype: Accuracybottom: ip2bottom: labeltop: accuracyinclude phase: TEST4、reshape在不改变数据的情况下,改变输入的维度。层类型:Reshape先来看例子layer name: reshapetype: Reshapebottom: inputtop: outputreshape_pa

29、ram shape dim: 0 # copy the dimension from belowdim: 2dim: 3dim: -1 # infer it from the other dimensions有一个可选的参数组shape,用于指定blob数据的各维的值(blob是一个四维的数据:n*c*w*h)。dim:0表示维度不变,即输入和输出是相同的维度。dim:2或dim:3将原来的维度变成2或3dim:-1表示由系统自动计算维度。数据的总量不变,系统会根据blob数据的其它三维来自 动计算当前维的维度值。假设原数据为:64*3*28*28,表示64张3通道的28*28的彩色图片经过r

30、eshape变换:reshape_param shape 0014-1dim:dim:dim:dim:输出数据为:64*3*14*565、DropoutDropout是一个防止过拟合的trick。可以随机让网络某些隐含层节点的权重不工作。先看例子:layer name: drop7type: Dropout”bottom: fc7-convtop: fc7-convdropout_param dropout_ratio: 0.5layer name: drop7type: Dropoutbottom: fc7-convtop: fc7-convdropout_param dropout_rat

31、io: 0.5只需要设置一个dropout_ratio就可以了五, Blob,Layer and Net以及对应配置文件的编写深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成。Caffe就 是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型。它将 所有的信息数据定义为blobs,从而进行便利的操作和通讯。Blob是caffe框架中一种标准 的数组,一种统一的内存接口,它详细描述了信息是如何存储的,以及如何在层之间通讯的。1、blobBlobs封装了运行时的数据信息,提供了CPU和GPU的同步。从数学上来说Blob就是 一个N维数组。它是ca

32、ffe中的数据操作基本单位,就像matlab中以矩阵为基本操作对象 一样。只是矩阵是二维的,而Blob是N维的。N可以是2, 3, 4等等。对于图片数据来说, Blob可以表示为(N*C*H*W)这样一个4D数组。其中N表示图片的数量,C表示图片的通道 数,H和W分别表示图片的高度和宽度。当然,除了图片数据,Blob也可以用于非图片数据。 比如传统的多层感知机,就是比较简单的全连接网络,用2D的Blob,调用innerProduct 层来计算就可以了。在模型中设定的参数,也是用Blob来表示和运算。它的维度会根据参数的类型不同而 不同。比如:在一个卷积层中,输入一张3通道图片,有96个卷积核,

33、每个核大小为11*11, 因此这个Blob是96*3*11*11.而在一个全连接层中,假设输入1024通道图片,输出1000 个数据,则Blob为1000*10242、layer层是网络模型的组成要素和计算的基本单位。层的类型比较多,如 Data,Convolution,Pooling,ReLU,Softmax-loss,Accuracy等,一个层的定义大至如下图:top blobbottom blob从bottom进行数据的输入,计算后,通过top进行输出。图中的黄色多边形表示输入 输出的数据,蓝色矩形表示层。每一种类型的层都定义了三种关键的计算:setup,forward and back

34、wordsetup:层的建立和初始化,以及在整个模型中的连接初始化。forward:从bottom得到输入数据,进行计算,并将计算结果送到top,进行输出。backward:从层的输出端top得到数据的梯度,计算当前层的梯度,并将计算结果送到 bottom,向前传递。3、Net就像搭积木一样,一个net由多个layer组合而成。现给出一个简单的2层神经网络的模型定义(加上loss层就变成三层了),先给出这 个网络的拓扑。第一层:name为mnist, type为Data,没有输入(bottom),只有两个输出(top), 个为data, 一个为label第二层:name为ip, type为In

35、nerProduct,输入数据data,输出数据ip第三层:name为loss, type为SoftmaxWithLoss,有两个输入,一个为ip, 个为label, 有一个输出loss,没有毋出来。对应的配置文件prototxt就可以这样写:name: LogReg”layer name: mnisttype: Datatop: datatop: labeldata_param source: input_leveldbbatch_size: 64layer name: iptype: InnerProductbottom: datatop: ipinner_product_param nu

36、m_output: 2layer name: losstype: SoftmaxWithLossbottom: ipbottom: label” top: loss 第一行将这个模型取名为LogReg,然后是三个layer的定义,参数都比较简单,只列 出必须的参数。六. Solver及其配置solver算是caffe的核心的核心,它协调着整个模型的运作。caffe程序运行必带的一 个参数就是solver配置文件。运行代码一般为# caffe train solver=*_slover.prototxt在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通

37、过优化 方法来求解。solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法 来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。到目前的版本,caffe提供了六种优化算法来求解最优参数,在solver配置文件中, 通过设置type类型来选择。Stochastic Gradient Descent (type: SGD), AdaDelta (type: AdaDelta),Adaptive Gradient (type: AdaGrad), Adam (type: Adam),Nesterov s Accelerated Gradient (typ

38、e: Nesterov) and RMSprop (type: RMSProp)具体的每种方法的介绍,请看本系列的下一篇文章,本文着重介绍solver配置文件的 编写。Solver的流程:1. 设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。(通过调用另 外一个配置文件prototxt来进行)2. 通过forward和backward迭代的进行优化来跟新参数。3. 定期的评价测试网络。(可设定多少次训练后,进行一次测试)4. 在优化过程中显示模型和solver的状态在每一次的迭代过程中,solver做了这几步工作:1、调用forward算法来计算最终的输出值,以及对应的los

39、s2、调用backward算法来计算每层的梯度3、根据选用的slover方法,利用梯度进行参数更新4、记录并保存每次迭代的学习率、快照,以及对应的状态。接下来,我们先来看一个实例: net: examples/mnist/lenet_train_test.prototxt test_iter: 100 test_interval: 500 base_lr: 0.01 momentum: 0.9 type: SGD weight_decay: 0.0005 lr_policy: inv gamma: 0.0001power: 0.75display: 100max_iter: 20000snap

40、shot: 5000snapshot_prefix: examples/mnist/lenet”solver_mode: CPU接下来,我们对每一行进行详细解译:net: examples/mnist/lenet_train_test.prototxt设置深度网络模型。每一个模型就是一个net,需要在一个专门的配置文件中对net进行配 置,每个net由许多的layer所组成。每一个layer的具体配置方式可参考本系列文文章中 的(2) - (5)。注意的是:文件的路径要从caffe的根目录开始,其它的所有配置都是这 样。也可用train_net和test_net来对训练模型和测试模型分别设定。

41、例如: train_net: examples/hdf5_classification/logreg_auto_train.prototxt test_net: examples/hdf5_classification/logreg_auto_test.prototxt 接下来第二行: test_iter: 100这个要与test layer中的batch_size结合起来理解。mnist数据中测试样本总数为10000, 一次性执行全部数据效率很低,因此我们将测试数据分成几个批次来执行,每个批次的数量 就是batch_size。假设我们设置batch_size为100,则需要迭代100次才能将

42、10000个数 据全部执行完。因此test_iter设置为100。执行完一次全部数据,称之为一个epoch test_interval: 500测试间隔。也就是每训练500次,才进行一次测试。base_lr: 0.01lr_policy: invgamma: 0.0001power: 0.75这四行可以放在一起理解,用于学习率的设置。只要是梯度下降法来求解优化,都会有一个 学习率,也叫步长。base_lr用于设置基础学习率,在迭代的过程中,可以对基础学习率进 行调整。怎么样进行调整,就是调整的策略,由l r_policy来设置。lr_policy可以设置为下面这些值,相应的学习率的计算为:-f

43、ixed:保持 base_lr 不变.-step:如果设置为step,则还需要设置一个stepsize,返回base_lr * gamma ” (floor(iter / stepsize),其中 iter 表示当前的迭代次数-exp:返回 base_lr * gamma iter, iter 为当前迭代次数-inv :如果设置为 inv,还需要设置一个 power,返回 base_lr * (1 + gamma * iter)(- power)-multistep:如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很 相似,step是均匀等间隔变化,而mul

44、tistep则是根据stepvalue值变化-poly:学习率进行多项式误差,返回 base_lr (1 - iter/max_iter) ” (power)-sigmoid:学习率进行 sigmod 衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize)multistep 示例:base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 # The learning rate policy lr_policy: multistep” gamma: 0.9 stepvalue: 5000 stepvalue: 7000 stepvalue: 8000 stepvalue: 9000 stepvalue: 9500 接下来的参数: momentum : 0.9上一次梯度更新的权重,具体可参看下一篇文章。 type: SGD优化算法选择。这一行可以省掉,因为默认值就是SGD。总共有六种方法可选择,在本文的 开头已介绍。weight_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号