前言
听说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_leveldb
和 cifar10_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.prototxt
和 cifar10_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 国际许可协议进行许可。欢迎转载,并请注明来自:黄钢的博客 ,同时保持文章内容的完整和以上声明信息!