Caffe cifar10 实例

"【Caffe-windows】 cifar10实例过程记录"

Posted by Canary on April 14, 2018

前言

听说cifar-10是Dataset届的元老级别存在,Cifar-10由60000张32*32的RGB彩色图片构成,共10个分类。50000张训练,10000张测试(交叉验证)。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类(姊妹数据集Cifar-100达到100类,ILSVRC比赛则是1000类)。,现对此在 Windows Caffe 下的操作做简要记录!

Windows 下的 Caffe 环境配置—–“Caffe for Windows10”

cifar-10数据集获取

cifar-10数据集和cifar-100数据集的官方网址都是:https://www.cs.toronto.edu/~kriz/cifar.html

cifar-10有三种版本,我下载的是第三个 CIFAR-10 binary version (suitable for C programs)

CIFAR-10 python version	163 MB	c58f30108f718f92721af3b95e74349a
CIFAR-10 Matlab version	175 MB	70270af85842c9e89bb428ec9976c926
CIFAR-10 binary version (suitable for C programs)	162 MB	c32a1d4ab5d03f1284b67883e8d87530

将下载好的压缩包压缩到路径 D:\GitHub Repository\caffe\data\cifar10

在当前目录下新建 convert_cifar10_leveldb.txt 保存,然后重命名为 convert_cifar10_leveldb.bat,内容如下:

..\..\build\x64\install\bin\convert_cifar_data.exe cifar-10-batches-bin .\ leveldb  
pause  

运行此bat文件,会在当前路径下生成两个文件夹,cifar10_test_leveldbcifar10_train_leveldb

计算均值

在当前目录下新建 mean.txt 保存,然后重命名为 mean.bat

..\..\build\x64\install\bin\compute_image_mean.exe cifar10_train_leveldb mean.binaryproto --backend=leveldb  
pause  

运行此bat文件,会在当前路径下生成均值文件,mean.binaryproto

训练数据前的参数修改

关注 D:\GitHub Repository\caffe\examples\cifar10下的两个文件 cifar10_quick_solver.prototxtcifar10_quick_train_test.prototxt。这两种文件的参数解读,参考之前博客Caffe Mnist 实例

cifar10_quick_solver.prototxt 这个文件是具体的训练网络的引入文件,定义了CNN网络架构之外的一些基础参数,如总的迭代次数、测试间隔、基础学习率、基础学习率的更新策略、训练平台(GPU或CPU)等。

# reduce the learning rate after 8 epochs (4000 iters) by a factor of 10
# The train/test net protocol buffer definition
net: "examples/cifar10/cifar10_quick_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.001
momentum: 0.9
weight_decay: 0.004
# The learning rate policy
lr_policy: "fixed"
# Display every 100 iterations
display: 100
# The maximum number of iterations
max_iter: 4000
# snapshot intermediate results
snapshot: 4000
snapshot_prefix: "examples/cifar10/cifar10_quick"
# solver mode: CPU or GPU
solver_mode: GPU

cifar10_quick_train_test.prototxt模型定义了一个包含3个卷积层,3个池化层,2个全连接层,3个激活函数层的卷积神经网络模型,通过 Caffe 自带的 prototxt 文件可视化python脚本来将 lenet.prototxt 可视化直观感受下:

D:\GitHub Repository\caffe\python路径下使用 Windows PowerShell 输入以下命令:

python .\draw_net.py ..\examples\cifar10\cifar10_quick_train_test.prototxt cifar10_qu
ick_train_test.png

  • “训练”:数据路径source: "data/cifar10/cifar10_train_leveldb";均值文件路径mean_file: "data/cifar10/mean.binaryproto";数据格式声明: backend: LEVELDB

  • “测试”:数据路径source: "data/cifar10/cifar10_test_leveldb";均值文件路径定义mean_file: "data/cifar10/mean.binaryproto"; 同时数据格式要改为 LEVELDB :

name: "CIFAR10_quick"
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "data/cifar10/mean.binaryproto"
  }
  data_param {
    source: "data/cifar10/cifar10_train_leveldb"
    batch_size: 100
    backend: LEVELDB
  }
}
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mean_file: "data/cifar10/mean.binaryproto"
  }
  data_param {
    source: "data/cifar10/cifar10_test_leveldb"
    batch_size: 100
    backend: LEVELDB
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 32
    pad: 2
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "gaussian"
      std: 0.0001
    }
    bias_filler {
      type: "constant"
    }
  }
}

省略下列不需要修改的各种层的定义部分!

开始训练 cifar10

来到 Caffe 的根目录 D:\GitHub Repository\caffe 新建文件: run-train-cifar10.txt :

.\build\x64\install\bin\caffe.exe train --solver=examples/cifar10/cifar10_quick_solver.prototxt  
pause

修改文件名为 run-train-cifar10.bat,双击运行,开始训练数据,结束后,在D:\GitHub Repository\caffe\examples\cifar10 生成第一个caffemodel是训练完毕得到的模型参数文件,第二个solverstate是训练中断以后,可以用此文件从中断地方继续训练。

新建文件:run-test-cifar10.txt :

build\x64\install\bin\caffe.exe test -model=examples\cifar10\cifar10_quick_train_test.prototxt -weights=examples\cifar10\cifar10_quick_iter_4000.caffemodel
pause  

修改文件名为: run-test-cifar10.bat,双击运行测试网络的效果和质量。

顺带一提:

  • 只要是用caffe train -solver=xxxxxxx,那就是从头开始训练。
  • 凡是遇到caffe train -solver=xxxx -weights=xxxxxx.caffemodel,那就是用已有模型参数(权重偏置)去初始化网络,称为finetune。

利用cifar10的训练权值分类自己的图片

回到 D:\GitHub Repository\caffe\data\cifar10 ,新建 synset_words.txt,存储代表cifar10数据的类别标签:

airplane
automobile
bird
cat
deer
dog
frog
horse
ship
truck

找一张自己的图,图片最好是cifar10里边有的种类,当然也可以下载其他的,不过分类得到的标签肯定不对,因为训练得到的模型不包含此种类。

比如一只猫,我将猫的图片放在路径 D:\GitHub Repository\caffe\data\cifar10下:

使用模型进行分类,新建classification_one.bat文件,比如我新建在路径 D:\GitHub Repository\caffe\data\cifar10下 ,内容如下:

..\..\build\x64\install\bin\classification.exe ../../examples/cifar10/cifar10_quick.prototxt ../../examples/cifar10/cifar10_quick_iter_4000.caffemodel ./mean.binaryproto ./synset_words.txt ./cat.jpg
pause

** bat的格式为 XX/XX/classification.exe xx/xx/网络结构(cifar10_quick.prototxt) XX/XX/训练好的模型(.caffemodel.h5) XX/XX/均值文件 XX/XX/下载的图片 (XX/XX代表路径 )。**

这个时候运行bat文件就可以了。

结束!!

知识共享许可协议本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。欢迎转载,并请注明来自:黄钢的博客 ,同时保持文章内容的完整和以上声明信息!