一.数据层及参数要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等,而一个模型由多个屋(layer)构成,每一屋又由许多参数组成。所有的参数都定义在caffe.proto这个文件中。要熟练使用caffe,最重要的就是学会配置文件(prototxt)的编写。层有很多种类型,比如Data,Convolution,Pooling等,层之间的数据流动是以Blobs的方式进行。今天我们就先介绍一下数据层.数据层是每个模型的最底层,是模型的入口,不仅提供数据的输入,也提供数据从Blobs转换成别的格式进行保存输出。通常数据的预处理(如减去均值,放大缩小,裁剪和镜像等),也在这一层设置参数实现。数据来源可以来自高效的数据库(如LevelDB和LMDB),也可以直接来自于内存。如果不是很注重效率的话,数据也可来自磁盘的hdf5文件和图片格式文件。所有的数据层的都具有的公用参数:先看示例layer{name:cifartype:Datatop:datatop:labelinclude{phase:TRAIN}transform_param{mean_file:examples/cifar10/mean.binaryproto}data_param{source:examples/cifar10/cifar10_train_lmdbbatch_size:100backend:LMDB}}name:表示该层的名称,可随意取type:层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同(后面会详细阐述)。一般在练习的时候,我们都是采用的LevelDB或LMDB数据,因此层类型设置为Data。top或bottom:每一层用bottom来输入数据,用top来输出数据。如果只有top没有bottom,则此层只有输出,没有输入。反之亦然。如果有多个top或多个bottom,表示有多个blobs数据的输入和输出。data与label:在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。这种(data,label)配对是分类模型所必需的。include:一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。Transformations:数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255,即将输入数据由0-255归一化到0-1之间其它的数据预处理也在这个地方设置:transform_param{scale:0.00390625mean_file_size:examples/cifar10/mean.binaryproto#用一个配置文件来进行均值操作mirror:1#1表示开启镜像,0表示关闭,也可用ture和false来表示#剪裁一个227*227的图块,在训练阶段随机剪裁,在测试阶段从中间裁剪crop_size:227}1、数据来自于数据库(如LevelDB和LMDB)层类型(layertype):Data必须设置的参数:source:包含数据库的目录名称,如examples/mnist/mnist_train_lmdbbatch_size:每次处理的数据个数,如64可选的参数:rand_skip:在开始的时候,路过某个数据的输入。通常对异步的SGD很有用。backend:选择是采用LevelDB还是LMDB,默认是LevelDB.示例:layer{name:mnisttype:Datatop:datatop:labelinclude{phase:TRAIN}transform_param{scale:0.00390625}data_param{source:examples/mnist/mnist_train_lmdbbatch_size:64backend:LMDB}}2、数据来自于内存层类型:MemoryData必须设置的参数:batch_size:每一次处理的数据个数,比如2channels:通道数height:高度width:宽度示例:layer{top:datatop:labelname:memory_datatype:MemoryDatamemory_data_param{batch_size:2height:100width:100channels:1}transform_param{scale:0.0078125mean_file:mean.protomirror:false}}3、数据来自于HDF5层类型:HDF5Data必须设置的参数:source:读取的文件名称batch_size:每一次处理的数据个数示例:layer{name:datatype:HDF5Datatop:datatop:labelhdf5_data_param{source:examples/hdf5_classification/data/train.txtbatch_size:10}}4、数据来自于图片层类型:ImageData必须设置的参数:source:一个文本文件的名字,每一行给定一个图片文件的名称和标签(label)batch_size:每一次处理的数据个数,即图片数可选参数:rand_skip:在开始的时候,路过某个数据的输入。通常对异步的SGD很有用。shuffle:随机打乱顺序,默认值为falsenew_height,new_width:如果设置,则将图片进行resize示例:layer{name:datatype:ImageDatatop:datatop:labeltransform_param{mirror:falsecrop_size:227mean_file:data/ilsvrc12/imagenet_mean.binaryproto}image_data_param{source:examples/_temp/file_list.txtbatch_size:50new_height:256new_width:256}}5、数据来源于Windows层类型:WindowData必须设置的参数:source:一个文本文件的名字batch_size:每一次处理的数据个数,即图片数示例:layer{name:datatype:WindowDatatop:datatop:labelinclude{phase:TRAIN}transform_param{mirror:truecrop_size:227mean_file:data/ilsvrc12/imagenet_mean.binaryproto}window_data_param{source:examples/finetune_pascal_detection/window_file_2007_trainval.txtbatch_size:128fg_threshold:0.5bg_threshold:0.5fg_fraction:0.25context_pad:16crop_mode:warp}}二.视觉层(VisionLayers)及参数本文只讲解视觉层(VisionLayers)的参数,视觉层包括Convolution,Pooling,LocalResponseNormalization(LRN),im2col等层。1、Convolution层:就是卷积层,是卷积神经网络(CNN)的核心层。层类型:Convolutionlr_mult:学习率的系数,最终的学习率是这个数乘以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,不扩充。扩充的时候是左右、上下对称的,比如卷积核的大小为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,我们限制卷积的连接操作在一个子集内。如果我们根据图像的通道来分组,那么第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_mult:1}param{lr_mult:2}convolution_param{num_output:20kernel_size:5stride:1weight_filler{type:xavier}bias_filler{type:constant}}}2、Pooling层也叫池化层,为了减少运算量和数据维度而设置的一种层。层类型:Pooling必须设置的参数:kernel_size:池化的核大小。也可以用kernel_h和kernel_w分别设定。其它参数:pool:池化方法,默认为MAX。目前可用的方法有MAX,AVE,或STOCHASTICpad:和卷积层的pad的一样,进行边缘扩充。默认为0stride:池化的步长,默认为1。一般我们设置为2,即不重叠(步长=窗口大小)。也可以用stride_h和stride_w来设置。示例:layer{name:pool1type:Poolingbottom:conv1top:pool1pooling_param{pool:MAXkernel_size:3stride:2}}pooling层的运算方法基本是和卷积层是一样的。输入:n*c*w0*h0输出:n*c*w1*h1和卷积层的区别就是其中的c保持不变w1=(w0+2*pad-kernel_size)/stride+1;h1=(h0+2*pad-kernel_size)/stride+1;如果设置stride为2,前后两次卷积部分重叠。3、LocalResponseNormalization(LRN)层此层是对一个输入的局部区域进行归一化,达到“侧抑制”的效果。可去搜索AlexNet或GoogLenet,里面就用到了这个功能层类型:LRN参数:全部为可选,没有必须local_size:默认为5。如果是跨通道LRN,则表示求和的通道数;如果是在通道内LRN,则表示求和的正方形区域长度。alpha:默认为1,归一化公式中的参数。beta:默认为5,归一化公式中的参数。norm_region:默认为ACROSS_CHANNELS。有两个选择,ACROSS_CHANNELS表示在相邻的通道间求和归一化。