Caffe 源碼閱讀(三) caffe.cpp

时间:2023-01-30 15:40:39

补:主要函数运行顺序: main>>GetBrewFunction>>train>>Solve

從main函數說起:

1、gflags庫中爲main函數設置usage信息 是google的一個開源的處理命令行的參數的庫。在使用命令行參數的文件夾文件中(源文件或頭文件),首先使用以下定義語句進行變量的定義。 DEFINE_int32, DEFINE_int64, DEFINE_bool等, 語法爲:DEFINE_int32(name,default_value,"description")。接着你就可以使用FLAGS_name變量了,這些變量的值則是由命令行參數傳遞,無則爲默認值,在其他代碼文件中若想使用該命令參數,可以用DECLARE_int32(name)聲明(name爲int32類型,也可以使用其它支持類型)

2、main函數中,出現了GetBrewFunction函數,在標準指令下,main函數將執行GetBrewFunction函數。

在caffe.cpp中定義了一些BrewFunction類的函數,通过RegisterBrewFunction(function)注册进容器g_brew_map:

int device_query(): 用来查询GPU信息

int train(): 训练神经网络

int time(): 测试model执行时间

GetBrewFunction函数通过caffe命令后第一个参数在g_brew_map容器中查找对应函数指针并返回,简单来说就是决定之后的操作是Train or Test。

3、train函数

-----------------------------------------------------------------------------------

检查 --solver --snapshot --weight 并输出消息 利用glog庫输出

-----------------------------------------------------------------------------------

实例化 SolverParameter 类,该类保存solver参数和相对应的方法 将-solver指定的solver.prototxt文件内容解析到solver_param中,该函数声明在include/caffe/util/upgrade_proto.hpp中,是现在src/caffe/util/upgrade_proto.cpp中

-----------------------------------------------------------------------------------

处理snapshot,stop or none 信号,其声明在include/caffe/util/signal_Handler.h中

GetRequestedAction在caffe.cpp中,将‘stop’,'snapshot','none'转换为标准信号,即解析:

caffe::SignalHandler singal_handler(GetRequestedAction(FLAGS_sigint_effect),GetRequestedAction(FLAGS_sighup_effect));

-----------------------------------------------------------------------------------

从snapshot或caffemodel中恢复train:

solver->Restore

-----------------------------------------------------------------------------------

开始优化

solver->Solve();

优化完成