< 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)的成员函数只有一个,那就是:
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子类