梳理caffe代码layer_factory

//工厂模式
#include "stdafx.h"
#include <string>
#include<iostream>
using namespace std;
class Product
{
public:
	virtual void use(){};
};
class ConcreteProductA :public Product
{
public:
	void use()
	{
		cout << "使用A" << endl;
	};
};
class ConcreteProductB:public Product
{
public:
	void use()
	{
		cout << "使用B" << endl;
	};
};
class Factory
{
public:
	Product* Factory::createProduct(string proname){
		if ("A" == proname)
		{
			return new ConcreteProductA();
		}
		else if ("B" == proname)
		{
			return new ConcreteProductB();
		}
		return  NULL;
	}
};
int main()
{
	Product *P = NULL;
	Product *Q = NULL;
	Factory f;
	P=f.createProduct("A");
	Q = f.createProduct("B");
	P->use();
	Q->use();
	return 0;
}

这个是最简单的工厂模式。

Layer_factory的主要作用是负责Layer的注册,已经注册完事的Layer在运行时可以通过传递一个 LayerParameter 给 CreaterLayer 函数的方式来调用:

LayerRegistry::CreateLayer(param);//可以参考net.cpp 中的调用方法

假设有一个如下的Layer:

template <typename Dtype>
class MyAwesomeLayer : public Layer<Dtype> {
  // your implementations
};

它的type就是C++类名,除去后缀”Layer”:

(“MyAwesomeLayer” -> “MyAwesome”).

我们可以通过以下两种方式来注册一个Layer:

只有一个构造函数

如果这个Layer只能通过它的构造函数来创建的话,在对应的C++文件里面加入以下行就行:

REGISTER_LAYER_CLASS(MyAwesome);

有可选的构造函数

如果这个Layer还可以通过另外一个如下形式的构造函数构造:

template <typename Dtype>
 Layer<Dtype*> GetMyAwesomeLayer(const LayerParameter& param) {
   // your implementation
 }

具体可以参考GetConvolutionLayer,Layer_factory.cpp。
这种情况下,我们可以通过注册构造函数的方式来进行Layer的注册:

REGISTER_LAYER_CREATOR(MyAwesome, GetMyAwesomeLayer)

以上是layer_factory要做的事情。

本人比较懒,看看黄晓东的一个EUCLIDEAN LOSS Layer描述,我就直接搬砖放到一部分了。


,工厂模式是为了弥补面向对象型编译语言的不足,会被OO的多态所需要。

以Caffe为例:

我们当前有一个基类指针Layer* layer;

在程序运行之前,计算机并不知道这个指针究竟要指向何种派生类。是卷积层?Pooling层?ReLU层?

鬼才知道。一个愚蠢的方法:

if(type==CONV) {....}
else if(type==POOLING) {....}
else if(type==RELU} {.....}
else {ERROR}

看起来,还是可以接受的,但是在软件工程专业看来,这种模式相当得蠢。

工厂模式借鉴了工厂管理产品的经验,将各种类型存在数据库中,需要时,拿出来看看。

这种模式相当得灵活,当然,在Caffe中作用不是很大,仅仅是为了花式好看。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值