Caffe的Net初始化
基本情况
源文件:
src/caffe/net.cpp
include/caffe/net.hpp
python/caffe/_caffe.cpp
定义Net对象:可以同时指定prototoxt和caffemodel,也可以先Prototxt再从caffemodel复制blobs取值;Python/C++均可。e.g.
net = caffe.Net(prototxt, caffemodel, caffe.TEST)
定义Net对象,C++:
shared_ptr< Net<float> > net(new caffe::Net<float>(prototxt, TEST));
net->CopyTrainedLayersFrom(caffemodel);
Net对象初始化
构造函数把任务转移给了Init()函数:
template <typename Dtype>
Net<Dtype>::Net(const NetParameter& param) {
Init(param);
}
template <typename Dtype>
void Net<Dtype>::Init(const NetParameter& in_param) {
... //超长的一大串内容
}
Init()
函数主要内容包括:
- 找到并插入各种split层:FilterNet()和InsertSplits()
- 各layer的建立:
layers_.push_back(LayerRegistry<Dtype>::CreateLayer(layer_param));
- 设置各layer的blobs,保证连接性
- 真正的建立起各个layer:
layers_[layer_id]->SetUp(bottom_vecs_[layer_id], top_vecs_[layer_id]);
建立各个layer的时候,调用了LayerSetUp()
和Reshape()
函数。
// include/caffe/layer.hpp
void SetUp(const vector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {
CheckBlobCounts(bottom, top);
LayerSetUp(bottom, top); //
Reshape(bottom, top); //
SetLossWeights(top);
}