windows caffe cpu 之 mnist入门训练和测试

本教程尽量详细,大多步骤都有图,如果运行出错,请先对照自己的文件是否和图上的一样,包括标点啊,空格啊,斜杠,反斜杠啊之类的小细节。

第一步:   官网下载mnist数据 http://yann.lecun.com/exdb/mnist/,共4个文件,解压放到caffe\data\mnist下

如图:

第二步: 转换成caffe需要的数据格式,此处转换为 LMDB(cifar是转换成 LEVELDB,可对比参考如何实现的) ,转换格式需要用到caffe里的项目convert_mnist_data ,这个convert_mnist_data.exe程序是放在build\examples\mnist\Release下,如果是用 debug生成的解决方案,则是在build\examples\mnist\Release\Debug下,这个在写 bat文件的时候要注意更改相应的路径。 

在caffe\data\mnist下新建一个文本文档,更改后缀为 .bat  在里面复制以下code: 

..\..\build\examples\mnist\Release\convert_mnist_data.exe  ..\..\data\mnist\train-images.idx3-ubyte ..\..\data\mnist\train-labels.idx1-ubyte ..\..\examples\mnist\mnist_train_lmdb  

echo.  

..\..\build\examples\mnist\Release\convert_mnist_data.exe  ..\..\data\mnist\t10k-images.idx3-ubyte  ..\..\data\mnist\t10k-labels.idx1-ubyte ..\..\examples\mnist\mnist_test_lmdb 

pause

其实第一个路径就是 exe文件所在路径, 后面两个就是数据所在路径,最后一个是输出文件路径

保存后,双击运行

第三步: 更改lenet_train_test.prototxt 和lenet_solver.prototxt文件,主要是改数据的路径以及数据的格式(默认LMDB,若在第二步转成了LEVELD的话,要改成LEVELDB )

首先 lenet_train_test.prototxt改的有

    source: "../../examples/mnist/mnist_train_lmdb"

    batch_size: 64

    backend: LMDB

 

    source:"../../examples/mnist/mnist_test_lmdb"

    batch_size: 100

    backend: LMDB

 

如图:

 

 

lenet_solver.prototxt改的有

net:"../../examples/mnist/lenet_train_test.prototxt"

snapshot_prefix:"../../examples/mnist/lenet"

 

如图:

 

 

若用CPU在最后一行改成 CPU

第四步: 开始训练,和之前我博客里cifar10一样,有两种方法,这里只介绍第一种方法,用批处理文件的方法(想知道第二种方法的请查看之前博客http://blog.csdn.net/u011995719/article/details/53998331

 

在caffe\examples\mnist 下建立文本文档,后缀改为 .bat  复制以下code:

..\..\build\tools\Release\caffe.exe train --solver=../../examples/mnist/lenet_solver.prototxt

Pause

如图:

保存,双击运行,弹出命令窗,等待训练结束,我的显卡是 GTX 960M ,只需要1分07秒就迭代了10000次,准确率 0.991(用了一台i3的笔记本,cpu跑的,用了17分钟!)

如图:

第五步:测试

..\..\build\tools\Release\caffe.exe test --model=../../examples/mnist/lenet_train_test.prototxt -weights=../../examples/mnist/lenet_iter_10000.caffemodel

Pause

第六步:利用自己的手写数字进行测试

(1)首先 D:\caffe\examples\mnist目录下生成手写的一个28*28像素数字的bmp文件和一个标签文件label.txt。比如我手写的数字如下图所示:

                 :label.txt

(2)生成mean.binaryproto,  在D:\caffe路径下,新建一个文件mnist_mean.bat,内容如下,双击运行,D:\caffe路径下,即可得到均值文件mean.binaryproto。

D:\caffe\build\tools\Release\compute_image_mean.exe D:/caffe/examples/mnist/mnist_train_lmdb mean.binaryproto
pause

(3)之后就可以调用之前生成的classification.exe进行分类。同样的在caffe目录下新建mnist_test_sigle_char.bat并写入如下内容:

D:\caffe\build\examples\cpp_classification\Release\classification.exe D:/caffe/examples/mnist/lenet.prototxt D:\caffe\examples\mnist\lenet_iter_10000.caffemodel D:\caffe\mean.binaryproto D:\caffe\examples\mnist\label.txt D:\caffe\examples\mnist\test1.bmp

Pause

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PS: 总结两个遇到问题:

1. 转换数据时候要确定转换的是 LMDB还是LEVELDB,这个是在一开始转换的时候设置的,一旦设置,在后面的train_test.prototxt文件中一定要对应的改过来,切记,切记。

2.Debug 和 Release    ,这个是在VS2013中选择的,具体有什么区别我不太清楚(百度了,说对使用问题不大),但是我们在调用例如 convert_mnist_data.exe 、compute_image_mean.exe等这些 应用程序时,要选择路径,一定要看清楚你生成的是在Debug文件夹(caffe\Build\x64\Debug)里还是在Release(caffe\Build\x64\Release)里,

如果你生成的是在Debug里,而调用的时候是用路径:. Build\x64\Release 的话,就会出现如下错误:

当然,可以在VS2013中分别 选择 Debug和Release 进行生成,这样就不用担心第二个问题啦。

 

 

 


2.Caffe网络模型要素及构成

Caffe的模型需要两个重要的参数文件:1.网络模型定义文件*.prototxt;2.网络参数文件*.solver.prototxt;

网络参数文件可以认为是经过训练算法求解得到网络参数后得到的,所以命名是*.solver.prototxt;

Caffe的网络模型定义文件定义了网络每一层的行为(行为描述)

2.1LeNet模型

看右路分支:data->conv1->pool1->conv2->pool2->ip1->(relu1)->ip2->loss(softMaxWithLoss)

依次了解:数据层(训练数据层和测试数据层)、卷积层、池化层、内积(全连接)层、ReLU层、Loss层、

1.数据层

网络模型的输入层为数据层,即网络模型的数据输入定义,一般包括训练数据和测试数据层两种类型。

source字段指明数据库文件的路径;

bachsize:指明批处理的大小

scale:取值在[0,1]区间

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
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_test_lmdb"
    batch_size: 100
    backend: LMDB
  }
}

2.卷积层

blobs_lr:1,blobs_lr:2 分别表示weight和bias更新时的学习率,这里的权值学习率为solver.prototxt中定义的学习率。

bias学习率为权重学习了的两倍,这样会得到较好的收敛速度。

num_output表示滤波器的个数;kernel_size是滤波核的大小,stride是滤波器的滑动步长,

weight_filter表示滤波器的类型;

xavier(发音[‘zeɪvɪr]):是从[-scale,scale]中进行均匀采样,对卷积层或全连接层中的参数进行初始化的方法。

xavier:caffe中具体是怎样实现的,代码位于include/caffe/filler.hpp文件中

#代表注释
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1    #权重weight的学习率
  }
  param {
    lr_mult: 2    #偏置bias的学习率,一般为weight学习率的两倍
  }
  convolution_param {
    num_output: 20    #卷积核(滤波器)的个数
    kernel_size: 5    #卷积核的大小5*5
    stride: 1          #卷积核的滑动步长1
    weight_filler {
      type: "xavier"    #滤波器的类型
    }
    bias_filler {
      type: "constant"    #偏置的初始化方式
    }
  }
}
3.Pooling层
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}

4.内积(全连接)层

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.ReLU(矫正线性单元)Rectifier Line Uint

非线性变化层:max(0,x)

一般与卷积层成对出现。

layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}

6.Softmax层

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

2.2 参数配置文件(训练后得到的网络参数文件)

*.slover.ptototxt文件

Caffe的参数配置文件*.slover.prototxt定义了网络模型训练过程中需要设置的参数,比如,学习率、权重衰减系数、迭代次数,使用GPU还是CPU进行计算。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值