caffe学习-代码阅读Layer

参考《深度学习轻松学》冯超

Layer主要包含两个方面,LayerRegistry辅助层的动态创建;Layer基类,其他的功能类由此派生
1.LayerRegistry
layer_factory.hpp
管理层的创建,工厂模式,实现根据Layer的名字创建Layer类
class LayerRegistry
{
public:
typedef shared_ptr<Layer> (Creator)(const LayerParamater&);
这里定义的是函数指针他输入一个形参 const LayerParamater&,返回Layer指针,这个指针的别名为Creator,他就是具体的层的构造方法,shared_ptr为智能指针,用引用计数使得内存自动销毁
typedef std::map<string,Creator> CreatorRegistry;
这里将string到函数指针Creator的映射(字典)重命名为CreatorRegistry,其中string是层的名字
static CreatorRegistry& Registry()
{
static CreatorRegistry
g_registry_=new CreatorRegistry();
return *g_registry_;
}
这里的Registry()是静态成员函数没有this指针,只能访问静态成员变量,同时g_registry是静态变量,只创建一次,在程序结束前都有效,与Layer只在初始化的时候创建类似,返回一块map<string,函数指针>的内存

}
创建层的简化代码如下
shared_ptr<Layer> CreatorLayer(const LayerParamater &param)
{
const string &type=param.type;
CreatorRegistry &registry=Registry();
return registrytype;
}
取出param中的string作为层的名字(索引),然后用param作为初始化参数传入创建层函数中,层的创建在程序执行中根据string 和param确定,为工厂模式
CreatorRegistry只是创建了,一块string到函数指针映射的内存,并没有写入值,下面的函数给出了显式的初始化过程
static void AddCreator(const string &type,Creator creator)
{
CreatorRegistry &registry=Registry();
registry[type]=creator;
}
然后进一步封装
class LayerRegisterer
{
public:
LayerRegisterer(string &type,shared_ptr<Layer> (*creator)(const LayerParameter&))
{
LayerRegistry::AddCreator(type,creator);
}
}
声明上述类,在构造的时候,传入Layer的名字和创建方法就完成了注册。为了简化层的注册caffe定义了两个宏
#define REGISTER_LAYER_CREATOR(type, creator)
static LayerRegisterer g_creator_f_##type(#type,creator) ;
static LayerRegisterer g_creator_d_##type(#type,creator);
##表示连接,#表示字符串,通过宏定义定义了一个模板类,类的名字为LayerRegisterer,对象名为g_creator_f_type,参数为“type”和creator
有时候,我们想只声明层的名字就生成层,只需要规定好层名和方法命名的规则
#define REGISTER_LAYER_CLASS(type)
template


shared_ptr<Layer Creator_##type##Layer(const LayerParameter&:
param)
{
return shared_ptr<Layer(new type##Layer(par皿));\
}
REGISTER_LAYER_CREATOR(type, Creator_##type##Layer)
}
这里的Creator_##type##Layer和type##Layer都是预先规定好的名字和方法的关联。
上面还有一个关键的类LayerParameter,由于不同的层需要的参数各不相同,在caffe中是通过protobuf解决的,只需要写较少的代码,同时比较灵活
layer_factory.cpp是对一些层是否使用cuDNN进行的处理
layer.hpp声明了几个虚方法,forward和backward相关,layersetup以及reshape
layerSetup从protobuf中读入参数进行初始化,reshape实现从bottom到top的张量的reshape。还有SetLossWeight是非虚函数,和损失层前向传播与反向传播的转换有关,设置损失的权重,默认为1。
layer.cpp中没有什么内容

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值