Net类是Caffe中Blobs,Layers,Nets三个抽象层次中最高层的抽象。Nets类负责按照网络定义文件将需要的layers和中间blobs进行实例化,并将所有的Layers组合成一个有向无环图。Nets还提供了在整个网络上进行前向传播与后向传播的接口。下面从观察Net运行的角度来解析一下Net类如何工作。
Net类数据成员概述
下面对Net类中比较重要的数据成员进行说明:
vector<shared_ptr<Layer<Dtype> > > layers_;
layers_中存放着网络的所有layers,也就是Net类的实例保存着网络定义文件中所有layer的实例
vector<shared_ptr<Blob<Dtype> > > blobs_;
blobs_中保存着网络所有的中间结果,即所有layer的输入数据(bottom blob)和输出数据(top blob)
vector<vector<Blob<Dtype>*> > bottom_vecs_;
vector<vector<Blob<Dtype>*> > top_vecs_;
bottom_vecs_
保存的是各个layer的bottom blob的指针,这些指针指向blobs_
中的blob。bottom_ves.size()
与网络layer的数量相等,由于layer可能有多个bottom blob,所以使用vector<Blob<Dtype>*>
来存放layer-wise的bottom blob。同理可以知道top_vecs
的作用。
vector<shared_ptr<Blob<Dtype> > > params_;
vector<Blob<Dtype>*> learnable_params_;
上述两个数据成员存放的是指向网络参数的指针,注意,直接拥有参数的是layer,params_
保存的只是网络中各个layer的参数的指针;而learnable_param