【NCNN源码分析】2.网络层基类

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& bottom_blobs, std::vector& 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& 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

你可能感兴趣的:(NCNN)