Caffe样例中mnist的文件之间逻辑分析

  约定一下,Caffe运行样例时在终端中使用的所有命令,同时终端中的目录已经cd到Caffe之中(别告诉我一个Github项目你还没有make all就直接拿过来用了)

sudo sh data/mnist/get_mnist.sh #联网获取minst数据库
sudo sh examples/mnist/create_mnist.sh #将数据转化成lmdb数据,lmdb就是一个有些类似SQL之类的东东
sudo vi examples/mnist/lenet_solver.prototxt #非必须,主要用于设置修改一些运行参数(修改后记得保存,怎么修改不在本文范围之内,姑且不提),也可将vi改成vim、gedit其他文本编辑器
sudo time sh examples/mnist/train_lenet.sh#运行程序

  以上命令是从网站直接复制过来的[1](当然我已经实验过了)为了方便说明我打算从这些命令倒序跟各位分析一下文件之间的逻辑关系。

1、train_lenet.sh:老子要运行了~~~

sudo time sh examples/mnist/train_lenet.sh
  打开train_lenet.sh,我们发现里面的代码十分的短小,有价值的就一句话:

./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt $@

  详细解释一下,solver参数是表示指定运行参数的程序,也就是说这次训练的运行参数(比如用CPU还是GPU运行程序,网络框架设置是在哪个程序,多少次迭代后显示一次结果等)都写在这个文件里面了,那么这个.prototxt文件就是这次任务的solver。
这个时候你突然觉得.prototxt怎么这么眼熟,其实,你看第三句不就写有lenet_solver.prototxt嘛!

2、lenet_solver.prototxt:老子跟你解释三大哲学问题:网络是谁、从哪来、到哪去。

  贴出此文件中跟文件有关的相关命令

net: "examples/mnist/lenet_train_test.prototxt"
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"

  (二三句的用途简单的说类似于断点续传,每 5000 iterations就可以得到model_iter_xxx.caffemodel 和model_iter_xxx.solverstate,所以我们姑且不详细描述)
lenet_solver.prototxt作为一个solver配置文件,整个项目的核心,甚至可以当作主程序也不为过,其他的只是说算是解决的问题之一就是确定了训练网络的文件路径(径……我没写错别字吧)

3、lenet_train_test.prototxt

  到了这里已经到了文件逻辑的末尾,如果熟悉json的话阅读起来会十分容易,里面都是字典,要么就是字典嵌套着字典,就像这样

layer{
    xx:xx
    xx{
        xxx:xx
        }
}

  在这里面依然可以发现一些文件路径,其实这些路径都是lmdb的数据路径,包括测试集的文件路径和训练集的文件路径。到此终端中运行的所有命令已从最后一句倒叙到第一句。

4、总结

  整个项目,文件之间的调用是单向向前的,并没看到你调用我我调用你样、甚至搞个大循环(1s)的情况(其实作为优秀的架构来讲也不应该这样)即

Created with Raphaël 2.1.0 开始 lmdb数据文件 lenet_train_test.prototxt:网络框架 lenet_solver.prototxt:solver配置 train_lenet.sh:运行项目 结束

  刚接触Caffe时我一直弄不清楚如何Caffe的使用的正确方式,找过的blog内容很详细但是让人在整个框架上就感觉十分的松散。本文试图从文件之间是如何调用来给大家浅尝Caffe框架里隐含的逻辑与思想。

posted @ 2016-12-17 21:22  MrYu4  阅读(20)  评论(0编辑  收藏  举报