您的位置:首页 > Web前端

caffe学习笔记:mnist

2016-04-22 22:22 337 查看
转载文章: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.sh如果提示wget和gunzip没有安装,需要分别安装他们,在运行脚本以后,有两个数据集mnisttrainlmdb,mnisttestlmdb.3、MNIST分类模型我们将会用LeNet网络,这个网络在数字分类任务中性能很好。比起原始的LeNet,我们要用稍微不同的版本用Relu激活但愿替换sigmoidLeNet网络包含CNN的精髓,用于大模型比如说ImageNet。一般来说,它包含卷积层,pooling层,全连接层。我们要定下这些层在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.proto默认的话,没有层规则13、MNIST定义检查prototxt的每一行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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: