一般来说,跑一个数据集需要以下步骤:1 把数据集转换成leveldb格式。例子
caffe神经网络框架的辅助工具(将图片转换为leveldb格式)
教程中的get_mnist.sh 是得到2个mnist data文件,一个用于训练,一个用于测试,而后create_mnist.sh是利用caffe-master/build/examples/mnist/的convert_mnist_data.bin工具,将mnist date转化为可用的leveldb 格式的文件。并将新生成的2个文件放于create_mnist.sh同目录下。
2 写网络配置文件,train.prototxt和test.prototxt,还有solver.prototxt。
在lenet_solver.prototxt除去注释的最前两行即为
train_net: "lenet_train.prototxt"和test_net: "lenet_test.prototxt",另外再加上别的权重、阈值、GPU选择等参数。在lenet_train.prototxt和lenet_test.prototxt中分别写好网络结构和参数,两者有很多相同部分。
图片label的意义:刚开始时,每副图片都有对应的label,利用这些label对最后label的对应来训练网络参数,致达标时即为训练完成,再进行测试以验证模型的好坏程度。
3 训练:tools的train_net.cpp文件。在每个例子的目录下都有个train.sh的shell脚本文件。
在/examples/mnist/下的train_lenet.sh文件中仅用两句话,
TOOLS=../../build/tools
GLOG_logtostderr=1 $TOOLS/train_net.bin lenet_solver.prototxt
实现用train_net.bin 训练网络的功能,我们所做的就是写好需要的编译文件,或者修改,或者重写。train_net.cpp中有些地方没看太懂。
4 测试:类似训练。
最后测试玩之后的模型作为二进制protobuf存储在lenet_iter_1000中。特征保存在master/example/_temp/features。softmax_loss层同时实现了softmax和多次Logistic损失。
caffe用到了第三方的数学函数库(cublas和mkl)来做矩阵操作。caffe采用了矢量化编程的方法,矢量化编程是提高算法速度的一种有效方法。为了提升特定数值运算操作(如矩阵相乘、矩阵相加、矩阵-向量乘法等)的速度,数值计算和并行计算的研究人员已经努力了几十年。矢量化编程的思想就是尽量使用这些被高度优化的数值运算操作来实现我们的学习算法。
方法1:找到比cublas更快的数学库。
方法 2:精通 GPU编程,研究 cublas等源码,提高数据的利用率。