Layer类是所有其他网络层的一个基类,所有的网络层都会从Layer继承,实现互异的计算过程,所有网络层的相似之处在于输入输出的规范以及前向传播的过程。
Option
是属性类,lightmode
表示轻量级模式在网络推理中会不断地进行垃圾回收,num_thread
表示线程数量,并且定义两个内存分配器,一个是对基本数据结构blob
的内存分配,另一个是对计算空间workspace
的内存分配。
class Option
{
public:
Option();
public:
bool lightmode;
int num_threads;
Allocator* blob_allocator;
Allocator* workspace_allocator;
};
公有函数第一部分,定义了空构造函数、空析构函数、模型加载与参数加载。采用虚基类方式,即使成为了多继承链路上的公共基类,在最后的派生类中也只有一个备份。
Layer();
virtual ~Layer();
virtual int load_param(const ParamDict& pd);
virtual int load_model(const ModelBin& mb);
定义两个参数决定了输入输出的规则,one_blob_only
表示该层为单输入单输出,support_inplace
表示是否可以进行就地运算。比如说,卷积层是不能就地运算的,该方法表示可以在输入数据的基础上直接修改得到输出数据,但是卷积过程有重复部分,如果修改会对后面的计算产生影响。因此对于前向推理函数就会有两种方式,加上刚才的是否是单输入单输出,一共有四个推理函数。
bool one_blob_only;
bool support_inplace;
virtual int forward(const std::vector<Mat>& bottom_blobs, std::vector<Mat>& top_blobs, const Option& opt = get_default_option()) const;
virtual int forward(const Mat& bottom_blob, Mat& top_blob, const Option& opt = get_default_option()) const;
virtual int forward_inplace(std::vector<Mat>& bottom_top_blobs, const Option& opt = get_default_option()) const;
virtual int forward_inplace(Mat& bottom_top_blob, const Option& opt = get_default_option()) const;
后面的参数定义了网络层的类型、名字、输入编号、输出编号,同时给出了一个注册器来创建Layer
。