caffe源码解读

1:caffe.cpp

关于typedef定义函数指针,其语法为:

  • typedef <返回类型> (*<函数类型名>)(参数表)
  • typedef <返回类型> (<类名>::*<函数类型名>)(参数表)
    例如
typedef void (*PF)(int x);

void func1(int x){
 cout<<"func1:"<void func2(int x){
 cout<<"func2:"<void main()
{
  PF pFunc;    //声明一个函数指针只需要用PF类型名
  pFunc = func1;  //此处也可以使用pFunc = &func1;
  pFunc(38);
  pFunc = func2;
  pFunc(99);
}

详细例子见:http://blog.163.com/zhengguo_li/blog/static/7030148020105623652802/
caffe中便是定义了train、test、time等的指向函数的指针。为
typedef int (*BrewFunction)();
然后又加入了一个map中
```typedef std::map BrewMap;
BrewMap g_brew_map;

另外在初始化g_brew_map时用到的

#define RegisterBrewFunction(func) \
namespace { \
class __Registerer_##func { \
 public: /* NOLINT */ \
  __Registerer_##func() { \
    g_brew_map[#func] = &func; \
  } \
}; \
__Registerer_##func g_registerer_##func; \
}``` 

其中define的用法见:http://blog.chinaunix.net/uid-17188120-id-4026378.html




solver -> net ->  layer

首先调用solver的构造函数,从文件中读取solverParameter存为变量**param**,其读取方法为ReadSolverParamsFromTextFileOrDie,之后再调用Solver的Init函数,
``````
 SolverParameter param;
 ReadSolverParamsFromTextFileOrDie(param_file, ¶m);
 Init(param);
``````

在Init函数中又会调用
``````
InitTrainNet();
InitTestNets();




<div class="se-preview-section-delimiter">div>

在InitTrainNet()中:
定义NetParameter net_param

NetParameter net_param;
net_param.CopyFrom();
ReadNetParamsFromTextFileOrDie();




<div class="se-preview-section-delimiter">div>

之后调用如上两个函数完成对net_param的初始化。之后调用net_.reset(new Net(net_param)); 构建网络,调用Net的构造函数。
Net的调用行为:
在构造函数中 调用Init(param); 其参数即为上面Solver中读入的NetParameter,其中在Init()中调用
NetParameter filtered_param;
FilterNet(in_param, &filtered_param);

在FilterNet中实现一些操作。应该是设置一些包含规则,比如说某一些layer在test中某一些layer在train中,即Phase。然后执行InsertSplits(filtered_param, ¶m); 。 在该函数中也是进行了以layer层数的循环:for (int i = 0; i < param.layer_size(); ++i) 具体实现的功能尚待细看。然后在Init函数下有一个以layer层数的循环:for (int layer_id = 0; layer_id < param.layer_size(); ++layer_id),在每一次循环过程中取得LayerParameter,const LayerParameter& layer_param = param.layer(layer_id); 并且经过后续操作创建该layer并将该layer压入layers_中,注意layers_的类型为vector > > layers_; 同时将layer的name压入layers_names_中。

你可能感兴趣的:(C-C++,机器学习算法)