1.caffe是一个清晰高效的深度学习框架,纯C++/CUDA架构,支持命令行和接口,可以在CPU和GPU之间直接无缝切换;
2.caffe的主要优点:
(1)CPU和GPU无缝切换;
(2) 模型和优化通过配置文件设置,无需代码;
3.下载并安装caffe:
(一)下载
(2) 安装
(3)caffe的下载和安装以及一些基本介绍在官网上已经有详细介绍,这里不再重复;
4、使用caffe的界面是命令行。 我个人认为训练模型时使用命令行就足够简单了。 对于训练好的模型,可以使用caffe的接口来调用。 本文首先介绍基于命令行的模型训练,然后以LeNet模型为例;
(2)LeNet模型
PS:LeNet是应用在手写数字数据库MNIST上的经典模型。 它有7层网络结构,分别是卷积层-下采样层-卷积层-下采样层-全连接层-全连接层-分类层。 具体网络详情请参考文章。 :
基于
1、安装编译caffe后,主目录包含:
2. 在训练模型之前,需要准备训练数据MNIST。 执行以下命令下载 MNIST 数据库:
3、由于caffe支持的数据类型不包括图像类型,所以常规做法需要将图像类型转换为lmdb类型:
4. 准备好数据后,我们需要定义我们的网络模型。 在caffe中,它是通过.文件定义的。 执行以下命令:
您可以看到每个网络层是如何定义的:
(1) 输入层(数据层):
[清楚的]
layer{name:"mnist"//表示图层名称 type:"Data"//表示图层类型 top:"data"top:"label"{phase:TRAIN//表示仅在训练中起作用Phase}{scale: 0.//归一化图像像素值}{:"/mnist/"//数据源:64//训练时每次迭代的输入样本数:LMDB//数据类型}}
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)卷积层:
[清楚的]
layer{name:"conv1"type:"":"data"//输入为:"conv1"//输出为卷积特征 param{:1//权重参数w的学习率倍数}param{ :2//偏置参数b的学习率倍数}{:::{//权重参数w的初始化方案,使用算法 type:""}{type:""//偏移参数b初始化为常量,通常0}}}
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) 下采样层(池):
[清楚的]
层{名称:“pool1”类型:“”:“conv1”顶部:“pool1”{pool:::2}}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
(4)全连接层:
[清楚的]
层{name:"ip1"类型:"":"pool2"top:"ip1"param{:1}param{:2}{:{type:""}{type:""}}}
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)非线性层:
[清楚的]
层{名称:“relu1”类型:“ReLU”:“ip1”顶部:“ip1”}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
(6)精度层(计算精度):
[清楚的]
层{名称:“”类型:“”:“ip2”:“标签”顶部:“”{阶段:测试}}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
(7)损失估计层:
[清楚的]
层{名称:“损失”类型:“”:“ip2”:“标签”顶部:“损失”}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}
5、定义好网络模型后,还需要配置模型优化的文件:
配置文件如下:
[清楚的]
#/:"/mnist/."//设置网络模型配置文件路径#.#,ns,#,.:100#s.:500#,.:0.:0.:0.0005#:" inv "伽玛:0.:0.75#:100#:10000#::"/mnist/lenet"#::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次迭代就会显示一次损失,每500次迭代就会计算一次测试精度,总共10000次迭代。 这些可以在配置文件中设置;
7. 训练后的模型保存在. 文件,可以被c等调用;
8.通过上一篇博文中LeNet模型的使用,我们可以发现使用caffe训练模型只需要以下步骤:
(1)准备数据;
(2)编写模型配置文件;
(3)编写优化配置文件;
(4) 命令行执行;
这样就可以得到训练好的model.file;
(3) 基于命令行的模型训练
1. 准备数据
(1)数据来源:任意jpg或其他格式的图片数据;
(2)将数据分为train和val数据集,并用文本记录对应的标签(自己写脚本即可),格式如下:
注意label是从0开始的;
(3) 将数据转换为lmdb。 在caffe的根目录/build/tools/下有各种可以使用的命令行任务。 为了将图像数据转换为lmdb,使用指令如下:
[清楚的]
$/\--=$\--=$\--\$\$/label.txt\$/
$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
其中是命令行路径; 根据自己的需要决定是否对原图进行转换;
2.训练模型
我们已经描述了如何配置模型文件和优化文件。 现在我们需要关注如何调用命令行进行训练:
很简单,指定优化配置文件的路径即可;
至此,模型训练结束,我们得到了我们想要的模型,存储在.;
3. 使用模型
下面记录如何通过命令行使用训练好的模型,主要描述各层特征的提取:
(1)测试。 描述测试的网络结构;
(2) ip2代表需要提取特征的层的名称;
4、注意事项
(1)jpg数据转换为lmdb时,需要标签文本信息。 一般来说,train 和 data 有标签,但 test data 没有。 一般为测试数据提供索引文本信息;
(2)模型训练过程中,会导入train数据和val数据。 train数据用于训练模型,val数据给出识别率并为参数调整提供参考; val数据不是必需的,可以根据需要在训练模型配置文件中使用。 在定义中;
(3) 训练过程的模型文件同时定义了训练模型和验证模型,而特征提取过程的模型文件只定义了测试模型;
(4)提取的特征中,每幅图像的特征顺序与输入的顺序不同。 为了获得caffe中模型训练过程中输入图像的顺序,可以提取测试数据的索引文本信息,或者是标签信息;
(5)提取的特征以lmdb形式给出,需要根据需要进行转换;