学习笔记: 源码 net.cpp 浅析

来源:互联网 发布:e站app 显示网络错误 编辑:程序博客网 时间:2024/06/04 17:48
1. 初始化函数
template <typename Dtype>void Net<Dtype>::Init(const NetParameter& in_param) {...map<string, int> blob_name_to_idx; //Blob名与index的mapset<string> available_blobs; //记录已有的Blob名memory_used_ = 0; //统计内存占用//初始化各数据成员个数,bottom_vecs_记录每层的bottom地址,top_vecs_记录每层的top地址,bottom_id_vecs,param_id_vecs, top_id_vecs,分别是bottom,该层的weight,top 的id。bottom_need_backward_表示是否需要后向传播,只要有一个输入Blob需要后传,则该层就需要后传。bottom_vecs_.resize(param.layer_size());top_vecs_.resize(param.layer_size());bottom_id_vecs_.resize(param.layer_size());param_id_vecs_.resize(param.layer_size());top_id_vecs_.resize(param.layer_size());bottom_need_backward_.resize(param.layer_size());for (int layer_id = 0; layer_id < param.layer_size(); ++layer_id) {...layers_.push_back(LayerRegistry<Dtype>::CreateLayer(layer_param)); //注册一个层for (int bottom_id = 0; bottom_id < layer_param.bottom_size(); ++bottom_id) {const int blob_id = AppendBottom(param, layer_id, bottom_id, //遍历所有的bottom,对于该层看是否需要连接&available_blobs, &blob_name_to_idx);}for (int top_id = 0; top_id < num_top; ++top_id) {AppendTop(param, layer_id, top_id, &available_blobs, &blob_name_to_idx); //同理有层与top的连接}...layers_[layer_id]->SetUp(bottom_vecs_[layer_id], top_vecs_[layer_id]); //连接完了进行layer的SetUp.for (int param_id = 0; param_id < num_param_blobs; ++param_id) { //像conv层这些有参数的会有param blobAppendParam(param, layer_id, param_id); //记录weight Blob到Net的后台数据库} }
函数中通过AppendBottom() 和 AppendTop() 对每一层前后的blob进行连接。其中在AppendTop()中还会new Blob对象。而在AppendBottom()中只需要保存相应的指针即可。

2. ForwardBackward(); //这个函数在net.hpp中
这里进行一次网络的前向传播 Forward(&loss) 和后向传播 Backward();,并计算相应的loss,和梯度。

3. Forward()
template <typename Dtype>const vector<Blob<Dtype>*>& Net<Dtype>::Forward(Dtype* loss) {...ForwardFromTo(0, layers_.size() - 1); //前向传播...}
template <typename Dtype>Dtype Net<Dtype>::ForwardFromTo(int start, int end) {...Dtype loss = 0;for (int i = start; i <= end; ++i) {Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]); //进行每层的前向传播,并计算loss,实际上只有loss层会输出loss,这时候需要跳转到 layer.cpp 查看相关代码loss += layer_loss;...}
4. Backward()
template <typename Dtype>void Net<Dtype>::Backward() {... BackwardFromTo(layers_.size() - 1, 0); //backward和forward相反,从后往前传播...}
template <typename Dtype>void Net<Dtype>::BackwardFromTo(int start, int end) {...for (int i = start; i >= end; --i) {if (layer_need_backward_[i]) { //先判断该层是否需要backward,则进行每层的backward,同样需要跳转到 layer.cpp 查看相关代码layers_[i]->Backward(top_vecs_[i], bottom_need_backward_[i], bottom_vecs_[i]);...} } }

5. 接下来就是了解 layer 层的forward 和 backward 了。
0 0
原创粉丝点击