怎么使用 Caffe 如何进行学术训练 LetNet-5 的训练和预测

Caffe(13)
在 我们已经对 LetNet-5 网络结构做出了详细的描述,接下来我们将深入分析 Caffe 中怎么使用 LetNet-5 的这个模型进行预测。
Caffe 中关于 LetNet-5 的实现文件主要存放于
第一步是进行 Caffe 的安装
接着看看在 Caffe 中怎么用
LetNet-5 进行训练和测试,整个流程如下:(先cd到
Caffe 的根目录下)
1)下载 minist 数据的命令:
$ cd data/mnist
这个脚本主要内容是从
上下载 mnist 训练和测试数据,并解压
2)将下载的数据转换为 Caffe 能识别的数据格式 LEVELDB 或 LMDB,对应的命令为:
$ ./examples/mnist/
上面的脚本调用了 build/examples/mnist/convert_mnist_data.bin这个可执行程序,对应的源文件为
完成之后,在目录 examples/mnist 发现生成了
examples/mnist/mnist_train_\ lmdb/ (对应训练集) 和 examples/mnist/mnist_test_lmdb/ (对应测试集或验证集)两个目录,每个目录下都有两个文件: data.mdb和lock.mdb
3)定义 LetNet-5 网络模型,在
中描述了广义的LetNet-5网络层设置,在
中描述了 LetNet-5 训练和 测试时各网络层的设置。大致是差不多的,就是有些细节不一样。
4)有了网络模型,在训练前我们还需要指定一些训练参数,在 中实现该功能的。这个文件最后一行是 GPU,如果没有GPU,需要改为CPU。不然报错
5) 现在我们有了训练数据、网络模型、指定了相关训练参数,可以开始训练网络 LetNet-5 了,使用下面的命令:
$./examples/mnist/,训练完成之后,我们得到了一个关于 LetNet-5 在 mnist 数据上的模型
caffemodel
train_lenet.sh:
./build/tools/caffe train -solver=examples/mnist/lenet_solver.prototxt
6)使用训练好的模型对数据进行预测,运行下面的代码:
$ ./build/tools/caffe.bin test \
-model examples/mnist/lenet_train_test.prototxt \
-weights examples/mnist/lenet_iter_10000.caffemodel \
-iterations 100
命令行解释:
./build/tools/caffe.bin test,表示只做预测(前向传播计算),不进行参数更新(后向传播计算)
-model examples/mnist/lenet_train_test.prototxt,指定模型描述文本文件
-weights examples/mnist/lenet_iter_10000.caffemodel 指定模型预先训练好的权值文件
-iterations 100,指定测试迭代次数,参与侧测试的样本数目为
(iterations*batch_size), test batch 设置为 100, 所以iterations =100时,刚好覆盖 10000个测试样本。
后续我们将对模型文件进行深入解析
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:161467次
积分:3569
积分:3569
排名:第9852名
原创:198篇
评论:67条
文章:29篇
阅读:4896
文章:45篇
阅读:42776
(3)(24)(39)(27)(16)(23)(13)(16)(14)(5)(9)(17)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'Caffe(13)
是Caffe关于LetNet-5的相关文件,
这里面有几个后缀是
.prototxt 的文件,它是用 protocol buffer 这个工具生成的文件。
百度百科对 protocol buffer 描述如下:
protocol buffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。Google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
Caffe 源码中大量使用 protocol buffer 作为权值和模型参数的载体。对于参数管理,我们拥有多种选择,有人喜欢 TXT 的易于修改,有人喜欢 BIN 的读写高效,也有人喜欢图形化配置的直观形象。不一致的参数管理带来很多问题。例如,一个项目组内不同成员必须约定一套统一的参数方案,或者称为通信协议,以便于模块集成。protocol buffer 工具完美的解决了这个问题,用户只需要建立统一的参数描述文件(proto),然后利用 protoc 编译就能让协议细节等关键部分代码自动生成,节省了大量的开发、调试时间。使用 protocol buffer 还可以跨语言(java、c#、c++、go 和 python)传递相同的数据结构,让团队协作更有效率。
下面我们来看看
Caffe 是如何定义和描述
LetNet-5 网络模型:
对于 LetNet-5 广义模型描述文件是
下面我们来详细看看 lenet.prototxt :
name: "LeNet" (网络的名字)
(定义一个网络层)
name: "data"
(网络层的名字为 data)
type: "Input"
(网络层的类型,输入)
top: "data"
(该网络层的输出叫 data )
input_param { shape: { dim: 64 dim: 1 dim: 28 dim: 28 } }
}(64张图像为一批,28*28大小)
(读取这批数据维度:64 1 28 28)
name: "conv1"
(网络层的名字为 conv1)
type: "Convolution"
(网络层类型是 卷积层)
bottom: "data"
(该层的输入层是 data 层)
top: "conv1"
(该层的输出层叫 conv1 feature maps)
lr_mult: 1
(weights的学习率与全局相同)
lr_mult: 2
(biases的学习率是全局的2倍)
convolution_param {
{(卷积操作参数设置)
num_output: 20
(卷积输出数量20,由20个特征图Feature Map构成)
kernel_size: 5
(卷积核的大小是5*5)
(卷积操作步长)
weight_filler {
type: "xavier"
(卷积滤波器的参数使用 xavier 方法来初始化)
bias_filler {
type: "constant"
(bias使用0初始化)
卷积之后这批数据维度:64 20 24 24
name: "pool1"
(网络层的名字是 pool1 )
type: "Pooling"
(网络层的类型是 池化操作)
bottom: "conv1"
(网络层的输入是 conv1 feature maps)
top: "pool1"
(网络层的输出是 pool1)
pooling_param {
(池化参数设置)
(最大池化操作)
kernel_size: 2
(池化核尺寸,2*2 区域池化)
(池化步长)
池化之后这批数据维度:64 20 12 12
name: "conv2"
(该网络层的名字)
type: "Convolution"
(该网络层的类型,卷积)
bottom: "pool1"
(该网络层的输入是 pool1)
top: "conv2"
(该网络层的输出是 conv2, feature maps)
lr_mult: 1
(weights的学习率与全局相同)
lr_mult: 2
(biases的学习率是全局的2倍)
convolution_param {
(卷积参数设置)
num_output: 50
(卷积的输出个数,由50个特征图Feature Map构成)
kernel_size: 5
(卷积核尺寸 5*5)
(卷积步长)
weight_filler {
type: "xavier"
bias_filler {
type: "constant"
卷积之后这批数据维度:64 50 8 8
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
kernel_size: 2
池化之后这批数据维度:64 50 4 4
name: "ip1"
(该网络层的名字 ip1)
type: "InnerProduct"
(该网络层的类型是 全链接层)
bottom: "pool2"
(该层的输入是 pool2)
top: "ip1"
(该层的输出是 ip1)
lr_mult: 1
lr_mult: 2
inner_product_param {
(全链接层的 参数设置)
num_output: 500
(500个输出神经元)
weight_filler {
type: "xavier"
bias_filler {
type: "constant"
500 个神经元
name: "relu1"
(该网络层的名字 relu1)
type: "ReLU"
(该网络层的类型, ReLU 激活函数)
bottom: "ip1"
(该层的输入是 ip1)
top: "ip1"
(该层的输出还是 ip1,底层与顶层相同是为了减少开支)
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
lr_mult: 1
lr_mult: 2
inner_product_param {
num_output: 10
(直接输出结果,0-9,十个数字所以维度是10)
weight_filler {
type: "xavier"
bias_filler {
type: "constant"
name: "prob"
type: "Softmax"
(损失函数)
bottom: "ip2"
top: "prob"
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:161469次
积分:3569
积分:3569
排名:第9852名
原创:198篇
评论:67条
文章:29篇
阅读:4896
文章:45篇
阅读:42776
(3)(24)(39)(27)(16)(23)(13)(16)(14)(5)(9)(17)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'caffe中LetNet-5卷积神经网络模型文件lenet.prototxt理解
caffe中LetNet-5卷积神经网络模型文件lenet.prototxt理解。caffe在 .\examples\mnist文件夹下有一个 lenet.prototxt文件,这个文件定义了一个广义的LetNet-5模型,对这个模型文件逐段分解一下。
name: &LeNet&
//网络的名称是LeNet
//定义一个网络层
name: &data&
//定义该网络层的名称为 data
type: &Input&
//定义网络层的类型是 输入层
top: &data&
//定义网络层的输出名称为data
//定义该网络层的训练参数
input_param {
//如果同时读取过多张图片进行训练,训练耗时比较久
//所以CNN中分组读入训练图片
//shape中第一个参数定义每组中包含图片数量
//第二个参数定义组数
//第三和第四个参数定义图片大小
//定义读取数据维度是: 64 1 28 28
shape: { dim: 64 dim: 1 dim: 28 dim: 28 }
//第一卷积层定义
//定义一个网络层
name: &conv1&
//网络层的名称是conv1
type: &Convolution&
//网络层的类型是 卷积层
//模型结构图有两种常用画法,一种是从左到右,一种是从下到上
//caffe中使用从下到上画法,所以&bottom&表示的是上一层(输入层)
bottom: &data&
//网络层的输入层是 data层
//同理,输出层在上,&top&表示输出
top: &conv1&
//该层的输出层名称为conv1
//param定义权重和偏置的学习率,学习率大,迭代速度快,但是容易找不到最优解
//学习率小,迭代速度慢,耗时久
//如果有两个lr_mult参数,第一个表示权重(卷积核)的学习率系数,第二个表示偏置的学习率系数
//lr_mult定义的只是学习率系数,最终的值需要乘以solver.prototxt配置文件中配置的base_lr的值
//一般偏置的学习率系数是权重学习率系数的2倍
lr_mult: 1
//该层权重学习率的系数为1
lr_mult: 2
//该层偏置学习率的系数为2
//卷积操作的参数设置
convolution_param {
num_output: 20
//卷积输出特征图的数量为20
kernel_size: 5
//卷积核的大小是5*5
//卷积操作的步长是1,即卷积核逐个移动
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
} //卷积完成之后,数据的维度变成 64 20 24 24
//第一池化层定义
name: &pool1&
//网络层的名称是pool1
type: &Pooling&
//网络层的类型是池化层
bottom: &conv1&
//网络层的输入时conv1(第一卷积层)
top: &pool1&
//网络层的输出名称是 pool1
//池化操作的参数设置
pooling_param {
//最大值池化
kernel_size: 2
//池化核尺寸 是2*2
//池化步长是2
//第一池化完成之后,数据的维度变成 64 20 12 12
//第二卷积层定义
name: &conv2&
//网络层的名称是conv2
type: &Convolution&
//网络层的类型是卷积层
bottom: &pool1&
//网络层的输入时 pool1(第一池化层)
top: &conv2&
//网络层的输出名称是 conv2
lr_mult: 1
//卷积核的学习率系数是1
lr_mult: 2
//偏置的学习率系数是2
//第二卷积层参数设置
convolution_param {
num_output: 50
//输出特征图的数量
kernel_size: 5
//卷积核的尺寸是5*5
//卷积操作步长是1
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
//第二卷积操作完成之后,数据维度是 64 50 8 8
//第二池化层
name: &pool2&
//网络层的名称是 pool2
type: &Pooling&
//网络层的类型是池化层
bottom: &conv2&
//网络层的输入时 conv2(第二卷积层)
top: &pool2&
//网络层的输出名称是 pool2
pooling_param {
//池化方式是最大值池化
kernel_size: 2
//池化核大小是2*2
//池化步长是2
//第二池化层完成之后,数据维度是
//第一层全连接层定义
name: &ip1&
//网络层的名称是ip1
type: &InnerProduct&
//网络层的类型是 全连接层
bottom: &pool2&
//网络层的输入时 pool2(第二池化层)
top: &ip1&
//网络层的输出名称是ip1
lr_mult: 1
//卷积核的学习率系数是1
lr_mult: 2
//偏置的学习率系数是2
//第一全连接层参数设置
inner_product_param {
num_output: 500
//输出向量维度,500个输出神经元
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
//第一全连接层完成之后数据的维度是 1
//激活函数层的定义
name: &relu1&
//网络层的名称是relu1
type: &ReLU&
//网络层的类型是ReLU激活函数
bottom: &ip1&
//网络层的输入时ip1(第一全连接层)
top: &ip1&
//网络层的输出名称是 ip1,跟输入名称一样
//激活层完成之后,数据的维度是 1 500 1 1
//第二全连接层定义
//数据的分类判断在本层完成
name: &ip2&
//网络层的名称是 ip2
type: &InnerProduct&
//网络层的类型是全连接层
bottom: &ip1&
//网络层的输入时 ip1(激活函数层)
top: &ip2&
//网络层的输出名称是 ip2
lr_mult: 1
//卷积核的学习率系数是1
lr_mult: 2
//偏置的学习率系数是2
//第二全连接层参数设置
inner_product_param {
num_output: 10
//输出维度是10,分别是0~9的数字
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
//第二全连接层完成之后,数据的维度是 1 10 1 1
//输出层定义
name: &prob&
//网络的名称是 prob
type: &Softmax&
//网络的类型是损失函数
bottom: &ip2&
//网络的输入是 ip2(第二全连接层)
top: &prob&
//网络的输出名称是 prob1217人阅读
Caffe(13)
LetNet-5 这个模型,在训练和测试时涉及到一些参数, Caffe 在 lenet_solver.prototxt 这个参数描述文件定义了相关参数。
# 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. // 一共10000张测试图像,test batch size 100 每次测试处理100张
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 // 使用CPU还是GPU
solver_mode: GPU
snapshot作用:可以今天训练5000次,然后关机回家睡觉,明天接着在此5000次基础之上再训练5000次。一个模型训练个几周时间,万一中间出了点故障,难道需要从头再来。所以保存中间的训练模型还是很有必要的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:161471次
积分:3569
积分:3569
排名:第9852名
原创:198篇
评论:67条
文章:29篇
阅读:4896
文章:45篇
阅读:42776
(3)(24)(39)(27)(16)(23)(13)(16)(14)(5)(9)(17)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'深度学习(28)
caffe在 .\examples\mnist文件夹下有一个 lenet.prototxt文件,这个文件定义了一个广义的LetNet-5模型,对这个模型文件逐段分解一下。
name: &LeNet&
//网络的名称是LeNet
//定义一个网络层
name: &data&
//定义该网络层的名称为 data
type: &Input&
//定义网络层的类型是 输入层
top: &data&
//定义网络层的输出名称为data
//定义该网络层的训练参数
input_param {
//如果同时读取过多张图片进行训练,训练耗时比较久
//所以CNN中分组读入训练图片
//shape中第一个参数定义每组中包含图片数量
//第二个参数定义组数
//第三和第四个参数定义图片大小
//定义读取数据维度是: 64 1 28 28
shape: { dim: 64 dim: 1 dim: 28 dim: 28 }
//第一卷积层定义
//定义一个网络层
name: &conv1&
//网络层的名称是conv1
type: &Convolution&
//网络层的类型是 卷积层
//模型结构图有两种常用画法,一种是从左到右,一种是从下到上
//caffe中使用从下到上画法,所以“bottom”表示的是上一层(输入层)
bottom: &data&
//网络层的输入层是 data层
//同理,输出层在上,“top”表示输出
top: &conv1&
//该层的输出层名称为conv1
//param定义权重和偏置的学习率,学习率大,迭代速度快,但是容易找不到最优解
//学习率小,迭代速度慢,耗时久
//如果有两个lr_mult参数,第一个表示权重(卷积核)的学习率系数,第二个表示偏置的学习率系数
//lr_mult定义的只是学习率系数,最终的值需要乘以solver.prototxt配置文件中配置的base_lr的值
//一般偏置的学习率系数是权重学习率系数的2倍
lr_mult: 1
//该层权重学习率的系数为1
lr_mult: 2
//该层偏置学习率的系数为2
//卷积操作的参数设置
convolution_param {
num_output: 20
//卷积输出特征图的数量为20
kernel_size: 5
//卷积核的大小是5*5
//卷积操作的步长是1,即卷积核逐个移动
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
} //卷积完成之后,数据的维度变成 64 20 24 24
//第一池化层定义
name: &pool1&
//网络层的名称是pool1
type: &Pooling&
//网络层的类型是池化层
bottom: &conv1&
//网络层的输入时conv1(第一卷积层)
top: &pool1&
//网络层的输出名称是 pool1
//池化操作的参数设置
pooling_param {
//最大值池化
kernel_size: 2
//池化核尺寸 是2*2
//池化步长是2
//第一池化完成之后,数据的维度变成 64 20 12 12
//第二卷积层定义
name: &conv2&
//网络层的名称是conv2
type: &Convolution&
//网络层的类型是卷积层
bottom: &pool1&
//网络层的输入时 pool1(第一池化层)
top: &conv2&
//网络层的输出名称是 conv2
lr_mult: 1
//卷积核的学习率系数是1
lr_mult: 2
//偏置的学习率系数是2
//第二卷积层参数设置
convolution_param {
num_output: 50
//输出特征图的数量
kernel_size: 5
//卷积核的尺寸是5*5
//卷积操作步长是1
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
//第二卷积操作完成之后,数据维度是 64 50 8 8
//第二池化层
name: &pool2&
//网络层的名称是 pool2
type: &Pooling&
//网络层的类型是池化层
bottom: &conv2&
//网络层的输入时 conv2(第二卷积层)
top: &pool2&
//网络层的输出名称是 pool2
pooling_param {
//池化方式是最大值池化
kernel_size: 2
//池化核大小是2*2
//池化步长是2
//第二池化层完成之后,数据维度是
//第一层全连接层定义
name: &ip1&
//网络层的名称是ip1
type: &InnerProduct&
//网络层的类型是 全连接层
bottom: &pool2&
//网络层的输入时 pool2(第二池化层)
top: &ip1&
//网络层的输出名称是ip1
lr_mult: 1
//卷积核的学习率系数是1
lr_mult: 2
//偏置的学习率系数是2
//第一全连接层参数设置
inner_product_param {
num_output: 500
//输出向量维度,500个输出神经元
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
//第一全连接层完成之后数据的维度是 1
//激活函数层的定义
name: &relu1&
//网络层的名称是relu1
type: &ReLU&
//网络层的类型是ReLU激活函数
bottom: &ip1&
//网络层的输入时ip1(第一全连接层)
top: &ip1&
//网络层的输出名称是 ip1,跟输入名称一样
//激活层完成之后,数据的维度是 1 500 1 1
//第二全连接层定义
//数据的分类判断在本层完成
name: &ip2&
//网络层的名称是 ip2
type: &InnerProduct&
//网络层的类型是全连接层
bottom: &ip1&
//网络层的输入时 ip1(激活函数层)
top: &ip2&
//网络层的输出名称是 ip2
lr_mult: 1
//卷积核的学习率系数是1
lr_mult: 2
//偏置的学习率系数是2
//第二全连接层参数设置
inner_product_param {
num_output: 10
//输出维度是10,分别是0~9的数字
weight_filler {
type: &xavier&
//卷积核参数采用xavier方法初始化
bias_filler {
type: &constant&
//偏置初始值为0
//第二全连接层完成之后,数据的维度是 1 10 1 1
//输出层定义
name: &prob&
//网络的名称是 prob
type: &Softmax&
//网络的类型是损失函数
bottom: &ip2&
//网络的输入是 ip2(第二全连接层)
top: &prob&
//网络的输出名称是 prob
lenet.prototxt模型可视化,可以作为对比:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:585963次
积分:7804
积分:7804
排名:第2830名
原创:213篇
转载:12篇
评论:299条
阅读:20039
文章:51篇
阅读:270061
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 如何进行力量训练 的文章

 

随机推荐