Caffe_stu01_理论准备

Caffe 简介

Caffe最开始设计时的目标只针对于图像,没有考虑文本、语音或者时间序列的数据,因此Caffe对卷积神经网络的支持非常好,但是对于时间序列RNN,LSTM等支持的不是特别充分。Caffe工程的models文件夹中常用的网络模型比较多,比如Lenet、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等。

模块结构

Caffe由低到高依次把

  • 网络中的数据抽象成Blob

Blob 四维连续数组,通常表示为(n, k, w, h)是基础的数据结构,可表示输入输出数据,也可表示参数数据

  • Blob表示网络中的数据,包括训练数据,网络各层自身的参数,网络之间传递的数据都是通过Blob来实现的,同时Blob数据也支持在CPU与GPU上存储,能够在两者之间做同步。

  • 各层网络抽象成Layer
  • Layer是对神经网络中各种层的抽象,包括卷积层下采样层,还有全连接层各种激活函数层等。同时

    • 每种Layer都实现了前向传播和反向传播,并通过Blob来传递数据

    • Layer 网络基本单元,每一层类型定义了3种计算: 1. 初始化网络参数。2. 前向传播的实现。 3. 后向传播。

  • 整个网络抽象成Net
  • Net是对整个网络的表示,由各种Layer前后连接组合而成,也是所构建的网络模型。

    • 无回路有向图,有一个初始化函数,主要有两个作用:

      1. 创建blobs和layers。
      2. 调用layers的setup函数来初始化layers。

      还有两个函数 Forward和Backward,分别调用layers的 forward 和 backward。

  • 网络模型的求解方法抽象成Solver。

    Solver 定义了针对Net网络模型的求解方法,记录网络的训练过程,保存网络模型参数,中断并恢复网络的训练过程。自定义Solver能够实现不同的网络求解方式。
    作用有:

    • 创建用于学习的训练网络和用于评估的测试网络;
    • 周期性的评估测试网络;
    • 通过调用前馈和后馈函数进行的迭代优化和参数更新。
      solver每轮迭代都会通过前馈函数计算输出和损失(loss),还用后馈传播来计算梯度。
      通过更新学习率等方法更新solver。

    训练好的caffe model 是用于保存和恢复网络参数,后缀为 .caffemodel;

    solver保存和恢复运行状态,后缀为 .solverstate

搭建神经网络使用流程

1. 数据格式处理

将数据处理成Caffe支持格式,具体包括:LEVELDB、内存数据、hdfs数据、图像数据、windows、dummy等

2. 编写网络结构文件

定义网络结构,如当前网络包括哪几层,每一层的作用是什么,使用Caffe过程中最麻烦的一个操作步骤,具体编写格式可参考caffe自带识别手写体样例:caffe/example/mnist/lenet_train_test.prototxt

3. 编写网络求解文件

定义了网络模型训练过程中需要设置的参数,比如学习率,权重衰减系数、迭代次数、使用GPU还是CPU等,一般命名方式为 xx_solver.prototxt,可以参考: caffe/example/mnist/lenet_train_test.prototxt

4.训练

基于命令行的训练,如:caffe train -solver examples/mnist/lenet_solver.prototxt

训练: solver.prototxt 是网络求解文件,由它定义 一些网络训练参数和网络结构文件路径等。

# 训练示例 (参数: 求解文件)
caffe train -solver examples/mnist/lenet_solver.prototxt

# 从训练一半的模型快照中恢复训练 (参数:求解文件 快照)
caffe train -solver examples/mnist/lenet_solver.prototxt -snapshot examples/mnist/lenet_iter_5000.solversta

# 由其它训练好的模型 fine-tune  (参数:求解文件 其它训练好的模型参数) 
caffe train -solver examples/finetuning_on_flickr_style/solver.prototxt \
-weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel
5. 测试

caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100

# score the learned LeNet model on the validation set as defined in the
# model architeture lenet_train_test.prototxt
# 测试 (参数: 求解文件 训练好的模型参数 )
caffe test -model examples/mnist/lenet_train_test.prototxt \ 
-weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100

Caffe几个重要的文件

  1. solver.prototxt

    solver这个文件主要存放模型训练所用到的一些超参数:

    • net := 指定待训练模型结构文件,即train_val.prototxt
    • test_interval := 测试间隔,即每隔多少次迭代进行一次测试
    • test_initialization := 指定是否进行初始测试,即模型未进行训练时的测试
    • test_iteration := 指定测试时进行的迭代次数
    • base_lr := 指定基本学习率
    • lr_policy := 学习率变更策略,这里有介绍,可供参考
    • gamma := 学习率变更策略需要用到的参数
    • power := 同上
    • stepsize := 学习率变更策略Step的变更步长(固定步长)
    • stepvalue := 学习率变更策略Multistep的变更步长(可变步长)
    • max_iter := 模型训练的最大迭代次数
    • momentum := 动量,这是优化策略(Adam, SGD, … )用到的参数
    • momentum2 := 优化策略Adam用到的参数
    • weight_decay := 权重衰减率
    • clip_gradients := 固定梯度范围
    • display := 每隔几次迭代显示一次结果
    • snapshot := 快照,每隔几次保存一次模型参数
    • snapshot_prefix := 保存模型文件的前缀,可以是路径
    • type := solver优化策略,即SGD、Adam、AdaGRAD、RMSProp、NESTROVE、ADADELTA等
    • solver_mode := 指定训练模式,即GPU/CPU
    • debug_info := 指定是否打印调试信息,这里有对启用该功能的输出作介绍
    • device_id := 指定设备号(使用GPU模式),默认为0

    用户根据自己的情况进行相应设置,黑体参数为必须指定的,其余参数为可选(根据情况选择)

  2. train_val.prototxt

    train_val文件是用来存放网络模型结构的地方,模型的结构主要以layer为单位来构建。下面我们以LeNet为例介绍网络层的基本组成:

    name: "LeNet"
    layer {
      name: "mnist"                                # 网络层名称
      type: "Data"                                 # 网络层类型,数据层
      top: "data"                                  # 这一层的输入,数据
      top: "label"                                 # 这一层的输出,标签
      include {    phase: TRAIN  }                 # TRAIN:=用于训练,TEST:=用于测试
      transform_param {    scale: 0.00390625  }    # 对数据进行scale
      data_param {                                 # 数据层配置 
        source: "examples/mnist/mnist_train_lmdb"  # 数据存放路径
        batch_size: 64                             # 指定batch大小
        backend: LMDB                              # 指定数据库格式,LMDB/LevelDB
      }
    }
    layer {
      name: "mnist"
      type: "Data"
      top: "data"
      top: "label"
      include {    phase: TEST  }
      transform_param {    scale: 0.00390625  }
      data_param {
        source: "examples/mnist/mnist_test_lmdb"
        batch_size: 100
        backend: LMDB
      }
    }
    layer{
        name:"conv1"       
        type:"Convolution" #卷积层
        bottom:"data"      #上一层的输出作为输入
        top:"conv1"        
        param{name:"conv1_w" lr_mult:1 decay_mult:1} #卷积层参数w的名称,学习率和衰减率(相对于base_lr和weight_decay的倍数)
        param{name:"conv1_b" lr_mult:2 decay_mult:0} #卷积层参数b的名称,学习率和衰减率
        convolution_param{
            num_output:20         #卷积层输出的feature map数量 
            kernel_size:5         #卷积层的大小
            pad:0                 #卷积层的填充大小
            stride:1              #进行卷积的步长
            weight_filler{type:"xavier" }      #参数w的初始话策略
            weight_filler{type:"constant" value:0.1}     #参数b的初始化策略
        }
    }
    layer {        #BatchNorm层,对feature map进行批规范化处理
        name:"bn1"
        type:"BatchNorm"
        bottom:"conv1"
        top:"conv1"
        batch_norm_param{ use_global_stats:false} #训练时为false,测试时为true
    }
    layer {           #池化层,即下采样层
      name: "pool1"
      type: "Pooling"
      bottom: "conv1"
      top: "pool1"
      pooling_param {
        pool: MAX   # 最大值池化,还有AVE均值池化
        kernel_size: 2
        stride: 2
      }
    }
    layer {
      name: "conv2"
      type: "Convolution"
      bottom: "pool1"
      top: "conv2"
      param {    lr_mult: 1  }
      param {    lr_mult: 2  }
      convolution_param {
        num_output: 50
        kernel_size: 5
        stride: 1
        weight_filler {      type: "xavier"    }
        bias_filler {      type: "constant"    }
      }
    }
    layer {
        name:"bn2"
        type:"BatchNorm"
        bottom:"conv2"
        top:"conv2"
        batch_norm_param{ use_global_stats:false}
    }
    layer {
      name: "pool2"
      type: "Pooling"
      bottom: "conv2"
      top: "pool2"
      pooling_param {
        pool: MAX
        kernel_size: 2
        stride: 2
      }
    }
    layer {                         #全连接层
      name: "ip1"
      type: "InnerProduct"
      bottom: "pool2"
      top: "ip1"
      param {    lr_mult: 1  }  
      param {    lr_mult: 2  }
      inner_product_param {
        num_output: 500
        weight_filler {      type: "xavier"    }
        bias_filler {      type: "constant"    }
      }
    }
    layer {                             # 激活函数层,提供非线性能力
      name: "relu1"
      type: "ReLU"
      bottom: "ip1"
      top: "ip1"
    }
    layer {
      name: "ip2"
      type: "InnerProduct"
      bottom: "ip1"
      top: "ip2"
      param {    lr_mult: 1  }
      param {    lr_mult: 2  }
      inner_product_param {
        num_output: 10
        weight_filler {      type: "xavier"    }
        bias_filler {      type: "constant"    }
      }
    }
    layer {                             # 损失函数层
      name: "prob"
      type: "SoftmaxWithLoss"
      bottom: "ip2"
      bottom: "label"
      top: "prob"
    }
    
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值