本人第一次写文章发出来自己也是一个小垃圾,只能保证教程尽可能详细图例尽可能清楚,如果大家有什么疑问我也尽可能一起学习解决
第一步:准备数据库
数据库的下载地址如下 http://yann.lecun.com/exdb/mnist/
在这个地方可以找到洗个下载链接如图所示:
用迅雷下的话会比较快一点,下载完之后放在桌面上就可以啦,分别解压
解压完之后,在桌面新建一个文件夹叫mnist
然后就变成了这样
这个是网站上上传的对应的二进制文件资料,通过写程序可以把他们读出来,CSDN上有这样的程序教程
但是作为一个战五渣我就不把他们读出来了,我们只需要两个文件。这两个文件的作用是链接caffe的训练网络和这些图片标签信息,我个人是这么理解的,怎么生成呢?
第二步:生成lmdb文件
在mnist文件夹下新建一个TXT文件,取名叫做:
将这个文件用notepad++打开编写程序
D:\PROGRAMME\CAFFE\caffe\build\examples\mnist\Release\convert_mnist_data.exe C:\Users\Dell\Desktop\mnist\train-images.idx3-ubyte C:\Users\Dell\Desktop\mnist\train-labels.idx1-ubyte C:\Users\Dell\Desktop\mnist\mnist_train_lmdb
echo.
D:\PROGRAMME\CAFFE\caffe\build\examples\mnist\Release\convert_mnist_data.exe C:\Users\Dell\Desktop\mnist\t10k-images.idx3-ubyte C:\Users\Dell\Desktop\mnist\t10k-labels.idx1-ubyte C:\Users\Dell\Desktop\mnist\mnist_test_lmdb
pause
注释:
D:\PROGRAMME\CAFFE\caffe\build\examples\mnist\Release\convert_mnist_data.exe
这一条改成你自己caffe的对应得convert_mnist_data.exe这个文件的绝对地址不知道在哪里的可以去caffe文件里面搜索一下,程序里面只是我自己的地址自己要记得修改一下。
C:\Users\Dell\Desktop\mnist\train-images.idx3-ubyte C:\Users\Dell\Desktop\mnist\train-labels.idx1-ubyte
这两个地址是咱们刚才在桌面上放的两个解压要的文件的地址 里面其实存放的是训练用数据的图片信息和标签信息
C:\Users\Dell\Desktop\mnist\mnist_train_lmdb
最后这个是要将上面两个信息转换成的对应得接口信息的存放地址,不用提前新建,他自己会建好的,只需要把地址也设计到对应的桌面文件里就可以啦
至于第四行就是跟第一行的道理是一样的只不过他转换的是测试用的图片和标签信息,记得更改好路径就可以啦
保存退出双击运行
结果如下:
这样就顺利生成了你可以再看一下自己的mnist就可以发现多了两个文件夹
里面都是这样的
原理解释一下这个程序就是用你caffe中已经安装好的一个小程序来处理一下这四个文件分别生成对应的功能类似于接口的文件可以再等会让网络连接他方便训练。
然后就可以进行下一步了。
第三步:编写prototxt文件
其实有两种方式第一种直接从caffe对应的文件里面找一下
那么咱们就找一下
你的caffe文件 \CAFFE\caffe\examples\mnist在这个路径下应该可以找到
这两个文件
然后把它们复制到你的桌面mnist中就可以了
然后用notepad++打开分别编辑修改一下
首先改第一个文件lenet_solver.prototxt
# The train/test net protocol buffer definition
net: "C:/Users/Dell/Desktop/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: "C:/Users/Dell/Desktop/mnist/lastfile"
# solver mode: CPU or GPU
solver_mode: CPU
第二行net改成桌面上你复制过来的
lenet_train_test.prototxt的路径
然后snapshot_prefix: "C:/Users/Dell/Desktop/mnist/lastfile"这个我当时写的时候出了一点错误,你们可以写成这样
snapshot_prefix: "C:/Users/Dell/Desktop/mnist/lastfile/"
这样之后训练完的临时文件就会放到lastfile文件中去了,我自己没在意后面的/这个所以导致就新建了一个文件夹所有的临时文件都被放到了mnist中间等会你们就会看到截图。不过这么些也没有问题
然后就是最后一行改成GPU,第一个文件就改完了
然后修改第二个程序
这个就是网络的描述啦
要改的应该就是两个路径分别对应刚才咱们所做出来的文件夹你们按照自己的电脑改一下就可以了
batch_size我忘记有没有改了你们自己看一下应该是一个64一个100应该没有问题
name: "LeNet"
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "C:/Users/Dell/Desktop/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: "C:/Users/Dell/Desktop/mnist/mnist_test_lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 20
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 50
kernel_size: 5
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
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"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 10
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}
这两个文件生成结束之后文件夹里面就变成了这样
第四步:启动训练文件
在文件夹下新建一个bat文件如图所示
用编辑器打开是写入程序
D:\PROGRAMME\CAFFE\caffe\build\tools\Release\caffe.exe train --solver=C:\Users\Dell\Desktop\mnist\lenet_solver.prototxt
Pause
train前面是在caffe里面的一个程序文件在你的caffe安装文件夹里面查找一下复制进来就可以
solver=后面是咱们自己刚才写的解决方案文件 因为用的是CPU所以这样就可以了
文件夹下面又多了一个就变成了这样
第五步训练
双击最后写的runtest.bat
然后就开始训练了
不断的迭代之后每隔5000个数据会生成一个数据文件我的就被放在mnist的下面了如果之前加了/那么你们就会放在lastfile下面啦
最后运行完之后就会变成这样
准确率0.9916 loss 0.0280678 其实在训练时你可以看出来loss总体是在呈现下降趋势的
之后文件夹里就会变成这样
当然你们的5000和10000的可能会在lastfile文件夹下面
谢谢大家看到这里,如果你也训练出来的话祝贺你啦希望你能在下面点个赞(害羞脸)毕竟是第一次写这种东西
其实网上还有别的大神写的文章也是将这个的,但他们的还是有点高屋建瓴,我可能比较垃圾看了好几个综合起来才顺利做出来了
万分感谢CSDN提供的平台
2018年3月17日BY ZZQ