caffe入门教程

(一)简介

1.caffe是一个清晰而高效的深度学习框架,纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口,可以在CPU和GPU直接无缝切换;

2.caffe的主要优势:

(1)CPU与GPU的无缝切换;

(2)模型与优化都是通过配置文件来设置,无需代码;

3.caffe的下载与安装:

(1)下载

(2)安装

(3)caffe的下载与安装以及一些基本的介绍官网已经描述地比较详细,这里不再重复;

4.caffe的使用接口有命令行,python跟matlab,个人觉得训练模型的时候使用命令行已经足够简单了,至于训练好的模型可以使用python与matlab的接口进行调用,本文先描述基于命令行的模型训练,以LeNet模型为例;

(二)LeNet模型


PS:LeNet是手写数字库MNIST上应用比较经典的模型,具有7层网络结构,分别是卷积-下采样-卷积-下采样-全连-全连-分类层,具体网络细节可以参考文章:

Gradient based learning applied to document recognition

1.安装编译完caffe后,其主目录下有:


2.训练模型之前需要先准备好训练数据MNIST,执行以下命令可以下载MNIST数据库:


3.由于caffe支持的数据类型不包括图像类型,所以常规做法需要将图像类型转为lmdb类型:


4.准备好数据之后,我们需要定义我们的网络模型,在caffe中是通过.prototxt配置文件来定义的,执行以下命令:


可以看到各个网络层是如何定义的:

(1)输入层(数据层):

  1. layer {  
  2.   name: "mnist"      //表示层名  
  3.   type: "Data"       //表示层的类型  
  4.   top: "data"          
  5.   top: "label"  
  6.   include {  
  7.     phase: TRAIN      //表示仅在训练阶段起作用  
  8.   }  
  9.   transform_param {  
  10.     scale: 0.00390625  //将图像像素值归一化  
  11.   }  
  12.   data_param {  
  13.     source: "examples/mnist/mnist_train_lmdb"   //数据来源  
  14.     batch_size: 64                              //训练时每个迭代的输入样本数量  
  15.     backend: LMDB                               //数据类型  
  16.   }  
  17. }  
layer {
  name: "mnist"      //表示层名
  type: "Data"       //表示层的类型
  top: "data"        
  top: "label"
  include {
    phase: TRAIN      //表示仅在训练阶段起作用
  }
  transform_param {
    scale: 0.00390625  //将图像像素值归一化
  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"   //数据来源
    batch_size: 64                              //训练时每个迭代的输入样本数量
    backend: LMDB                               //数据类型
  }
}
(2)卷积层:

  1. layer {  
  2.   name: "conv1"  
  3.   type: "Convolution"  
  4.   bottom: "data"               //输入是data  
  5.   top: "conv1"                 //输出是卷积特征  
  6.   param {  
  7.     lr_mult: 1                 //权重参数w的学习率倍数  
  8.   }  
  9.   param {  
  10.     lr_mult: 2                 //偏置参数b的学习率倍数  
  11.   }  
  12.   convolution_param {  
  13.     num_output: 20  
  14.     kernel_size: 5  
  15.     stride: 1  
  16.     weight_filler {           //权重参数w的初始化方案,使用xavier算法  
  17.       type: "xavier"  
  18.     }  
  19.     bias_filler {  
  20.       type: "constant"       //偏置参数b初始化化为常数,一般为0  
  21.     }  
  22.   }  
  23. }  
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"               //输入是data
  top: "conv1"                 //输出是卷积特征
  param {
    lr_mult: 1                 //权重参数w的学习率倍数
  }
  param {
    lr_mult: 2                 //偏置参数b的学习率倍数
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {           //权重参数w的初始化方案,使用xavier算法
      type: "xavier"
    }
    bias_filler {
      type: "constant"       //偏置参数b初始化化为常数,一般为0
    }
  }
}

(3)下采样层(pool):

  1. layer {  
  2.   name: "pool1"  
  3.   type: "Pooling"  
  4.   bottom: "conv1"  
  5.   top: "pool1"  
  6.   pooling_param {  
  7.     pool: MAX  
  8.     kernel_size: 2  
  9.     stride: 2  
  10.   }  
  11. }  
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}

(4)全连层:

  1. layer {  
  2.   name: "ip1"  
  3.   type: "InnerProduct"  
  4.   bottom: "pool2"  
  5.   top: "ip1"  
  6.   param {  
  7.     lr_mult: 1  
  8.   }  
  9.   param {  
  10.     lr_mult: 2  
  11.   }  
  12.   inner_product_param {  
  13.     num_output: 500  
  14.     weight_filler {  
  15.       type: "xavier"  
  16.     }  
  17.     bias_filler {  
  18.       type: "constant"  
  19.     }  
  20.   }  
  21. }  
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"
    }
  }
}
(5)非线性层:

  1. layer {  
  2.   name: "relu1"  
  3.   type: "ReLU"  
  4.   bottom: "ip1"  
  5.   top: "ip1"  
  6. }  
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
(6)准确率层(计算准确率):

  1. layer {  
  2.   name: "accuracy"  
  3.   type: "Accuracy"  
  4.   bottom: "ip2"  
  5.   bottom: "label"  
  6.   top: "accuracy"  
  7.   include {  
  8.     phase: TEST  
  9.   }  
  10. }  
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
(7)损失估计层:

  1. layer {  
  2.   name: "loss"  
  3.   type: "SoftmaxWithLoss"  
  4.   bottom: "ip2"  
  5.   bottom: "label"  
  6.   top: "loss"  
  7. }  
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

5.定义完网络模型,还需要配置关于模型优化的文件:

配置文件如下:

  1. # The train/test net protocol buffer definition  
  2. net: "examples/mnist/lenet_train_test.prototxt"     //设定网络模型配置文件的路径  
  3. # test_iter specifies how many forward passes the test should carry out.  
  4. # In the case of MNIST, we have test batch size 100 and 100 test iterations,  
  5. # covering the full 10,000 testing images.  
  6. test_iter: 100  
  7. # Carry out testing every 500 training iterations.  
  8. test_interval: 500                               
  9. # The base learning rate, momentum and the weight decay of the network.  
  10. base_lr: 0.01  
  11. momentum: 0.9  
  12. weight_decay: 0.0005  
  13. # The learning rate policy  
  14. lr_policy: "inv"  
  15. gamma: 0.0001  
  16. power: 0.75  
  17. # Display every 100 iterations  
  18. display: 100  
  19. # The maximum number of iterations  
  20. max_iter: 10000  
  21. # snapshot intermediate results  
  22. snapshot: 5000  
  23. snapshot_prefix: "examples/mnist/lenet"  
  24. # solver mode: CPU or GPU  
  25. solver_mode: GPU  
# The train/test net protocol buffer definition
net: "examples/mnist/lenet_train_test.prototxt"     //设定网络模型配置文件的路径
# test_iter specifies how many forward passes the test should carry out.
# In the case of MNIST, we have test batch size 100 and 100 test iterations,
# covering the full 10,000 testing images.
test_iter: 100
# Carry out testing every 500 training iterations.
test_interval: 500                             
# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 10000
# snapshot intermediate results
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
# solver mode: CPU or GPU
solver_mode: GPU

6.接下来一步就是进行训练了,直接执行命令就可以:


执行后可以看到:首先会读取配置文件初始化网络跟优化器:


紧接着开始优化:

可以看到训练过程中每100次迭代就会显示一个loss,每500次迭代就会计算一次test准确率,总共10000次迭代,这些都可以在配置文件中设置;

7.训练完之后的模型就保存在.caffemodel文件中,该文件可以被c,python,matlab等调用;

8.通过前面博文的LeNet模型的使用,我们可以发现,使用caffe训练模型只需要以下几个步骤:

(1)准备好数据;

(2)写好模型配置文件;

(3)写好优化配置文件;

(4)命令行执行;

这样就可以得到训练的模型.caffemodel文件了;

(三)基于命令行的模型训练

1.准备数据

(1)数据来源:任意的jpg或其他格式的图像数据;

(2)划分数据为train跟val数据集,并且使用文本记录好对应的标签(自己写脚本就可以),格式如下:


注意label是从0开始的;

(3)将数据转化为lmdb,在caffe的根目录下,/build/tools/下有各种可以使用的命令行工作,为了将图像数据转为lmdb,使用的是convert_imageset指令,具体如下:

  1. $CAFFE_TOOLS/convert_imageset \  
  2.              --resize_height=$RESIZE_HEIGHT \  
  3.              --resize_width=$RESIZE_WIDTH \  
  4.              --shuffle \  
  5.              $IMAGE_DATA_ROOT \  
  6.              $LABEL_DATA_PATH/label.txt \  
  7.              $OUTPUT_PATH/data_lmdb  
   $CAFFE_TOOLS/convert_imageset \
                --resize_height=$RESIZE_HEIGHT \
                --resize_width=$RESIZE_WIDTH \
                --shuffle \
                $IMAGE_DATA_ROOT \
                $LABEL_DATA_PATH/label.txt \
                $OUTPUT_PATH/data_lmdb
其中CAFFE_TOOLS是命令行路径;resize_height根据自己需要决定是否要将原始图片resize;

2.训练模型
前面已经讲述了如何配置模型文件跟优化文件,现在需要注意的是如何调用命令行来训练:


很简单,只需指定优化配置文件的路径即可;

至此模型训练结束,我们已经得到了我们想要的模型,存放在. caffemodel中;

3.使用模型

以下记录如何用命令行使用训练好的模型,主要是讲述提取每层的特征:


(1)test.prototxt描述的是测试的网络结构;

(2)ip2表示需要提取特征的层的名字;

4.注意事项

(1)在将jpg数据转为lmdb时,都需要有label的文本信息,一般来说,train跟validation数据是带有label的,test数据是没有的,一般是给test数据提供index文本信息;

(2)在模型训练过程中将导入train数据跟val数据,其中train数据是为了训练模型,val数据给出识别率为调参提供参考;其中val数据不是必须的,根据需要在训练模型配置文件中定义;

(3)训练过程的模型文件既定义了训练模型也定义了验证模型,而提取特征过程的模型文件中只定义测试模型;

(4)在提取的特征中,每张图象的特征的次序跟输入的次序是不一样的,为了得到caffe中模型训练过程的输入图像的次序,可以通过提取test数据的index文本信息,也就是label信息;

(5)提取出来的特征以lmdb形式给出,需要根据需要自行转换;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值