/****************************************************************************************************
文件说明:
caffe_windows下的第一个测试程序学习教程(一)
开发环境:
win10+caffe+Opencv2.4.8+CPU
时间地点:
陕西师范大学 文津楼 2017.5.29
具体操作:
1)下载数据
程序本身不带测试数据,需要我们去下载,测试数据的格式为leveldb数据库格式(一种数据库文件)。
您可以直接双击"F:\\caffe\\caffe-windows\\examples\\mnistget_mnist_leveldb.bat"这个windows环
境下的批处理脚本文件自动下载数据,但是一般都不能成功下载。因此,您可以直接到MNIST数据集的官
网"http://yann.lecun.com/exdb/mnist/"直接下载文件,文件解压后,得到两个文件夹:
1)mnist-train-leveldb
2)mnist-test-leveldb
3)将这两个文件夹直接复制到.\examples\mnist\目录下
2)修改配置文件
修改lenet_solver.prototxt文件,使用Notepad++软件打开这个文件,修改最后一行:
solver_mode: GPU------------------>solver_mode: CPU
3)运行.\examples\mnist\文件夹下的脚本文件"train_lenet.bat",这样就开始训练MNIST的数据识别模型了
4)运行时,有个错误,缺少libgfortran-3.dll文件,随便在网上下一个放在F:\caffe\caffe-windows\bin文
件夹下就可以了
train_lenet.bat文件的解读:
copy ..\\..\\bin\\MainCaller.exe ..\\..\\bin\\train_net.exe
SET GLOG_logtostderr=1
"../../bin/train_net.exe" lenet_solver.prototxt
pause
1)这个脚本文件其实很简单,只有四行:
第一行:将caffe安装文件根目录下的bin文件夹里面的MainCaller.exe复制一份,并将其重命名为
train_net.exe
第二行:设置glog日志。glog是Goole出的一个C++轻量级的日志库。
第三行:运行文件train_net.exe,并且给这个exe文件传递一个参数lenet_solver.prototxt
第四行:测试完毕后,暂停。
2)MainCaller.exe是整个程序的入口,由它来调用其他的测试。我们打开对应的MainCaller.cpp文件(具体
在.\examples\mnist\文件夹下),我们发现,这个文件只有一行代码。
#include "../../tools/train_net.cpp"
即使去调用train_net.cpp文件,打开tools下的train_net.cpp文件,熟悉的main就来了:
*****************************************************************************************************/
/*****************************************************************************************************
程序说明:
1)这是一个简单的脚本,允许人们快速地训练一个网络,其参数由文本格式指定
2)This is a simple script that allows one to quickly train a network whose parameters are
specified by text format protocol buffers.
使用方法:
train_net net_proto_file solver_proto_file [resume_point_file]
*****************************************************************************************************/
#include <cuda_runtime.h> //【1】cuda运行时的头文件
#include <iostream> //【2】C++的库文件
#include <cstring>
#include "caffe/caffe.hpp" //【3】caffe的头文件
using namespace caffe; //【4】包含caffe的命名空间
int main(int argc, char** argv)
{
::google::InitGoogleLogging(argv[0]); //【1】用第一个参数来初始化日志
::google::SetLogDestination(0, "../tmp/"); //【2】将参数放到caffe根目录下的../tmp/文件夹下
//【3】例如我的F:\caffe\caffe-windows\tmp
if (argc < 2 || argc > 3)
{
LOG(ERROR) << "Usage: train_net solver_proto_file [resume_point_file]";
return 1;
}
SolverParameter solver_param; //【4】创建测试参数对象
//【5】读取具体的参数配置
ReadProtoFromTextFileOrDie(argv[1], &solver_param);
LOG(INFO) << "Starting Optimization"; //【6】打印日志信息
SGDSolver<float> solver(solver_param); //【7】开始优化
if (argc == 3) //【8】根据调用时,是否带第三个参数,进行不同的测试
{
LOG(INFO) << "Resuming from " << argv[2];
solver.Solve(argv[2]);
}
else
{
solver.Solve();
}
LOG(INFO) << "Optimization Done."; //【9】优化结束,打印日志信息
return 0;
}