ncnn源码分析-003-net

1.结构信息

net是ncnn的核心部分,起着组织整个框架结构的作用,捋顺net的结构,基本上对ncnn的代码框架也就有一个大概的了解了。首先看一下net的类结构信息。

class Net
{
public:
    int usewinograd_convolution; //是否使用winograd进行卷积
    int use_sgemm_convolution; //是否使用矩形乘法的形式进行卷积
    int use_int8_inference; //是否使用int8进行推断
    int use_vulkan_compute; //是否使用gpu
    
    int load_param(FILE *fp); //从参数文件中读取网络结构
    int load_model(FILE *fp); //从模型文件中读取模型参数
    Extractor create_extractor(); //net中的另一个类Extractor
protected:
    std::vector<Blob> blobs;//网络的所有blob,但是不包含blob的具体数据(nchw维数据)
    std::vector<Layer*> layers;//网络的所有层指针
    
    int forward_layer(int layer_index, std::vector<Mat> &blob_mats, Options &opt);
    int find_blob_index_by_name(const char* name); //通过blob名字查找blobs里的index
    int find_layer_index_by_name(const char *name); //通过layer名字确定layer的索引
}

class Extractor
{
public:
    int Extractor::input(const char *blob_name, const Mat &in);
    int Extractor::input(int blob_index, VkMat &feat, VkCompute &cmd);
    int Extractor::extract(const char *blob_name, Mat &feat);
    int Extractor::extract(blob_index, const Mat &feat);//次函数直接forward_layer()

private:
    const Net *net;
    std::vector<Mat> blob_mats; // 该结构体是blob的真正数据存放
    Option opt;
}
2.forward_layer
  • forwar_layer有两个主要输入参数,分别是layer_index和blob_mats
    layer_index:要提取的blob的生产者
    blob_mats:整个网络中所有blob的真正数据
    首先根据layer_index找到对应layer,然后提取该layer的bottom_index和top_index,再根据bottom_index找到对应的blob,最后找到该blob的生产者,也就是上一层,进入递归调用。直到找到网络的第一层。
  • 入栈过程工作是从后往前找:layer_index——>bottom_blob——>bottom.producer(layer_index)不断找当前层的前一层,终止条件是bottom_blob维度不等于0
  • 出栈是从前往后一次执行layer的类成员函数layer->forward(bottom_blob, top_blob,opt):第一层的的输入是数据,得到输出,再作为下一层的输入,依次出栈,bottom_blob_index和top_blob_index是在入栈时候确定好的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值