1:caffe.cpp
关于typedef定义函数指针,其语法为:
- typedef <返回类型> (*<函数类型名>)(参数表)
- typedef <返回类型> (<类名>::*<函数类型名>)(参数表)
例如
typedef void (*PF)(int x);
void func1(int x){
cout<<"func1:"<<x<<endl;}
void func2(int x){
cout<<"func2:"<<x<<endl;}
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<caffe::string, BrewFunction> 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<Dtype>(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<shared_ptr<Layer<Dtype> > > layers_;
同时将layer的name压入layers_names_中。