caffe学习笔记:mnist

转载文章:http://blog.csdn.net/xiaoju222/article/details/43669651

caffe-mnist实例的官方链接http://caffe.berkeleyvision.org/gathered/examples/mnist.html 
1、在安装成功caffe的基础上运行mnist实例 
2、准备数据 
首先需要从MNIST网站上下载和改变数据格式,运行一下命令 
cd  CAFFEROOT./data/mnist/getmnist.sh./examples/mnist/createmnist.shwgetgunzipmnisttrainlmdb,mnisttestlmdb.3MNISTLeNetLeNetRelusigmoidLeNetCNNImageNetpooling CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt
4、定义MNIST网络 
lenet_train_test.prototxt定义详细,我们假设你液晶熟悉Google Prorobuf 和假设已经读过protobuf定义,这些可以 
在 $CAFFE_ROOT/src/caffe/proto/caffe.proto中找到。 
尤其是,我们将要写一个caffe::NetParameter protobuf,从给神经网络名字开始:name: “LeNet”

5、写数据层 
我们将会读mnist数据从lmdb(PS caffe只能读取lmdb和。。),数据层: 
layers { 
name: “mnist” 
type: DATA 
data_param { 
source: “mnist_train_lmdb” 
backend: LMDB 
batch_size: 64 
scale: 0.00390625 

top: “data” 
top: “label” 

(PS:前两行是属性,定义了层名称、层类型,而后半部分是各种参数,输入像素范围是[0,1),scale=1/256,这一层输出两个blob,data and label,blb:Blob是用以存储数据的4维数组,例如对于数据:Number*Channel*Height*Width;对于卷积权重:Output*Input*Height*Width;对于卷积偏置:Output*1*1*1)

6、写卷积层 
卷基层定义: 
layers { 
name: “conv1” 
type: CONVOLUTION 
blobs_lr: 1. 
blobs_lr: 2. 
convolution_param { 
num_output: 20 
kernelsize: 5 
stride: 1 %步数 
weight_filler { 
type: “xavier” 

bias_filler { 
type: “constant” 


bottom: “data” 
top: “conv1” 

这个fillers允许我们随意初始化weights和bias的值。对于权重filler,使用xavier算法去随机定义初始化的scale基于输入输出神经元。对于bias filler,我们将会简单的初始化他为常量,默认值是0。 
blob_lr是层可学习的元素,学习速率。权重学习速率和给予的solver during runtime,bias学习熟虑是两倍的权重学习速率。

7、写Pooling 层 
定义: 
layers { 
name: “pool1” 
type: POOLING 
pooling_param { 
kernel_size: 2 
stride: 2 
pool: MAX 

bottom: “conv1” 
top: “pool1” 

max pooling、stride 2、pool kernel size 2,所以在相近pooling区域之间没有重叠部分 
相同的,我们可以写第二个卷基层,pooling层,在中有详细描述 
$CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt

8、写全连接层 
layers { 
name: “ip1” 
type: INNER_PRODUCT 
blobs_lr: 1. 
blobs_lr: 2. 
inner_product_param { 
num_output: 500 
weight_filler { 
type: “xavier” 

bias_filler { 
type: “constant” 


bottom: “pool2” 
top: “ip1” 

这个定义了一个全连接层有500个输出

9、写ReLu层 
layers { 
name: “relu1” 
type: RELU 
bottom: “ip1” 
top: “ip1” 
}

10、在Relu层后接着另外一个全连接层 
layers { 
name: “ip2” 
type: INNER_PRODUCT 
blobs_lr: 1. 
blobs_lr: 2. 
inner_product_param { 
num_output: 10 
weight_filler { 
type: “xavier” 

bias_filler { 
type: “constant” 


bottom: “ip1” 
top: “ip2” 

11、损失层 
layers { 
name: “loss” 
type: SOFTMAX_LOSS 
bottom: “ip2” 
bottom: “label” 

包含softmax和多回归损失,有两个blob,预测和数据层提供的label。 
12、Additional Notes: Writing Layer Rules 
层定义可以包括定义 
layers { 
// …layer definition… 
include: { phase: TRAIN } 

控制层包含在网络中,基于当前的网络状态。层规则和模型模式参考 CAFFEROOT/src/caffe/proto/caffe.proto13MNISTprototxt CAFFE_ROOT/examples/mnist/lenet_solver.prototxt:
14、训练和测试模型 
在写过网络定义protobuf和solver protobuf后,训练模型是简单的,只要运行或者下面的命令 
cd $CAFFE_ROOT 
./examples/mnist/train_lenet.sh 
运行以后,会出现如下的信息 
I1203 net.cpp:66] Creating Layer conv1 
I1203 net.cpp:76] conv1 <- data 
I1203 net.cpp:101] conv1 -> conv1 
I1203 net.cpp:116] Top shape: 20 24 24 
I1203 net.cpp:127] conv1 needs backward computation. 
这新信息告诉你每一层详细的信息,他们连接和输出的类型,在初始化以后,训练开始 
I1203 net.cpp:142] Network initialization done. 
I1203 solver.cpp:36] Solver scaffolding done. 
I1203 solver.cpp:44] Solving LeNet 
基于solver setting,将会打印100次迭代后的损失函数和每1000次测试,可以看到这样的信息: 
I1203 solver.cpp:204] Iteration 100, lr = 0.00992565 
I1203 solver.cpp:66] Iteration 100, loss = 0.26044 
… 
I1203 solver.cpp:84] Testing net 
I1203 solver.cpp:111] Test score #0: 0.9785 
I1203 solver.cpp:111] Test score #1: 0.0606671 
过几分钟,就做好了: 
I1203 solver.cpp:84] Testing net 
I1203 solver.cpp:111] Test score #0: 0.9897 
I1203 solver.cpp:111] Test score #1: 0.0324599 
I1203 solver.cpp:126] Snapshotting to lenet_iter_10000 
I1203 solver.cpp:133] Snapshotting solver state to lenet_iter_10000.solverstate 
I1203 solver.cpp:78] Optimization Done. 
最后模型,存数的二进制protobuf 文件,存储在lenet_iter_10000

如果想在GPU下运行计算,只需要修改lenet_solver.prototxt文件的solver_mode即可,0是CPU,1是GPU。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值