caffe实战-第二天

今天主要学习caffe网络的一些定义。

    caffe模型需要两个重要的参数文件:网络模型(*.prototxt)和参数配置(*.solver.prototxt)。训练出的模型输出文件的格式为:*.caffemodel。

    caffe的模型是由Protocol Buffer语言定义后存放于caffe.prototxt中,使得caffe更加灵活易于扩展。

    caffe支持LevelDB,LMDB,HDF5三个数据库输入,原始图片需要通过convert_imageset.cpp转换格式。命令如下:

convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME

参数说明:FLAGS:图片参数,主要包括-gray是否灰度图,-shuffle是否随机打乱。

                    ROOTFOLDER/:图片的绝对路径。

                    LISTFILE:图片文件列表清单,一个txt文件,一行一张图片

                    DB_NAME:生成的数据库文件存放目录。

    caffe使用Blob结构来存储,交换和处理网络中正/反向传播的数据和导数信息。Blob中最重要的数据是values和gradients,存储单元对应data(网络中传递的普通数据)和diff(计算得到的梯度)两个数据节点。有两种数据访问方法:静态不改变数据方法和动态改变数据方法:

Const Dtype* cpu_data() const;

Dtype mutable_cpu_data();

    Layer是caffe模型的本质内容和执行计算的基本单元。可以执行卷积,池化,内积,rectified-linear和sigmoid等非线性操作,以及元素级的数据交换,归一化,数据加载,softmax和hinge等损失计算。在Layer catalogue层目录中可以查看所有操作。

1.Data Layers:位于最底层,数据可以从数据库/内存/硬盘中读取。预处理操作在该层进行,如尺度变换,随机裁剪和镜像等等,设定Transformation Parameter实现。

            (1). 数据库:

layer{
    name:"mnist"
    tpye:"Data"#层类型
    top:"data"
    top:"label"
    include{
        phase:TRAIN
    }
    transform_param{
        scale:0.0039
    } 
    data_param{
        source:"example/mnist/mnsit_train_lmdb"
        batch_size:64
        backend:LMDB
    }
}

    (2).内存数据:memory data 直接从内存中读取数据而不是拷贝,需要调用MemoryDataLayer::Resst(C++)或是Net.set_input_arrays(Python)来指定数据来源。

layer{
    width:100
    channels:1
}
transform_param{
    scale:0.0039
    mean_file:"mean.proto"
    mirror:false
}
}

(3).HDF5数据

layer{
    name:"data"
    type:"HDF5Data"  #层类型
    top:"data"
    top:"label"
    hsf5_data_param{
        source:"examples/hdf5_classification/data/train.txt"  #文件路径 必填
        batch_size:10    #每次输入网络数据  必填
    }
}

(4).图像数据Images

layer{
    name:"data"
    type:"ImageData"
    top:"data"
    top:"label"
    transform_param{
    mirror:false
    crop_size:227
    mean_file:"data/ilsvrc12/imagenet_mean.linaryproto"
    }
    image_data_param{
    source:”examples/_temp/file_list.txt“ #txt文件对应的路径  txt每一行对应一张图片 必填
    batch_size:50 #每次处理的图片数  必填
    new_height:256 
    new_width:256
    }
}

    (5).Windows窗口

        source&batch_size必填   层类型:WindowsData

    (6).Dummy 层类型:Dummydata 用于开发&调试

2.卷积层 Convolution Layers

    输入:n*c_i*h_i*w_i

    输出:n*c_o*h_o*w_o,    其中h_o=(h_i+2*pad_h-kerhel_h)/stride_i+1

layer{
    name:"conv1"
    type:"convulution" #层类型
    bottom:"data"
    top:"conv1"
    param{lr_mult:1 decay_mult:1} #卷积核的局部学习率和权值衰减因子
    param{lr_mult:2 decay_mult:0} #偏置的局部学习率和权值衰减因子
    convolution_param{
        num_output:96  #学习96组卷积核
        kernel_size:11
        stride:4  #滑动步长
        weight_filter{
            type:"gaussian"  #使用高斯分布初始化卷积核
            std:0.01
         }
        bias_filter{
            type:"constant"   #使用常数0初始化偏置
            value:0
        }
    }
}

3.池化层 Pooling Layer

    层类型:Pooling。池化层输入图片的大小如同卷积层。核的大小是必填参数。

4.全连层或内积层 InnerProduct Layers

   层类型:InnerProduct。 num_output(输出节点数)&weight_filter(参数初始化方案)必填。

    输入:n*c_i*h_i*w_i,输出:n*c_o*1*1

5.ReLU Layers

    层类型:ReLU

6.Sigmoid Layers

    层类型:Sigmoid

7.LRN Layers 局部响应值归一化

    层类型:LRN。通过对输入数的局部归一化操作,执行了一种“侧抑制”操作。

8.Dropout Layers

层类型:Dropout,防止过拟合,有概率的丢弃数据。

9.SoftmaxWithLoss Layers

 层类型:SoftmaxWithLoss,封装了softmax的loss层,输出loss值。

10.Softmax Layers

层类型:Softmax。无参数,输出拟然值。

11.Accuracy Layers

层类型:Accurary。phase:include必填,默认test阶段输出分类精度。

    Caffe Solver通过Net的前向推断计算和反向计算对参数进行更新,减小loss。Caffe有如下Solver:SGD(随机梯度下降),AdaDelta,AdaGrad(自适应梯度),Adam,Nesterov,RMPSprop。

    SGD:其中有两个重要的参数:学习率(负梯度的权重)&动量(一次更新值的权重),这两个学习参数需要一定的调整才能达到最好的效果。一般将学习率设置为0.01,当loss达到稳定时,将学习率除以一个常数,如10,重复多次。动量设置为0.9,它可以使权值更新更平缓。如果训练过程中出现发散,可以减小基准学习速率再训练,重复多次,找到一个合适的学习速率。

    AdaDelta:一种鲁邦的学习率方法,同样是基于梯度的优化方法。

    AdaGrad:自适应性梯度下降,需要格外的空间存储历史梯度信息。

    Adam:可以看做AdaGrad的泛化形式,参数默认值:momentum=0.9,momentum2=0.999,delta=10^-8.

    NAG:一种凸优化算法,与SGD权值更新相似。

    RMSprop:如果梯度产生震动,让梯度减少(乘以(1-delta)),否则乘以delta。默认值delta=0.02.





 

                    



猜你喜欢

转载自blog.csdn.net/cat1992/article/details/80163351