< NCNN-Lession-4 > 创建layer子类

开始

今天我们开始下一节,那就是我们要开始创建Layer子类,因为有了Layer子类,我们才可以针对不同的op进行不同的操作.所以我们再次插上一个小红旗.

作用

我们把之前第二节讲的父类Layer记做Layer(Father),把今天这一节讲的子类Layer记做Layer(Child).

Layer(Child)的作用主要是用来针对不同的op来提供一些不同的forward前向操作,同时Layer(Child)拥有自己的参数parameter和权重weight,它们也继承了来自父类的一些特性,比如name, type, one_blob_only等等.

我们今天就先实现一下squeezenet中的Layer(Child).我们不打算把Layer(Child)的所有成员都实现,今天仅仅实现他们的一些与网络proto有关的东西,比如成员变量等等.

实现

在squeezenet中,所有的layer op如有:

  • input
  • Convolution
  • Relu
  • Pooling
  • Split
  • Concat
  • Dropout
  • Softmax

大家可能对dropout有疑问,这里因为官方的ncnn的proto中包含了这个op,于是这里也把这个op加了上去.

先来看一下Layer(Child)都包含些什么成员:

layer_child

由于我们本节主要实现的是Layer(Child)的参数部分,暂时先不实现权重部分和前向部分,所以Layer(Child)的成员函数只有一个,那就是:

1
virtual int load_param(const ParamDict& pd);

这里要说明一下,Layer(Child)中重写Layer(Father)的load_param函数前面的virtual可加可不加,因为只要Layer(Father)加了virtual的关键字,Layer(Child)默认也会加的.

所以我们需要在Layer(Father)中也实现一个load_param的虚函数.

1
int Layer::load_param(const ParamDict&) { return 0; }

关于不同的Layer(Child)的参数params,由于每一个不同的层,有不同的参数,具体需要什么参数与该Layer前向的时候需要用到什么有关,这里就不多说了.

代码示例

这节其实没什么好说的,其实就是简单的实现了几个层.测试程序在这里

代码结构如下:

这里增加了一个文件夹layer,里面存放着Layer(Child)子类的实现.

< NCNN-Lession-4 > 创建layer子类

https://zhengtq.github.io/2020/12/10/ncnn-lession-4/

Author

Billy

Posted on

2020-12-10

Updated on

2021-03-13

Licensed under

Comments