caffe源码解读

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, &param);
 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, &param); 。 在该函数中也是进行了以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_中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值