学习笔记: 源码 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
- 学习笔记: 源码 net.cpp 浅析
- PixHawk学习笔记 之 源码浅析——mc_pos_control.cpp——task_main
- PixHawk学习笔记 之 源码浅析—mc_pos_control.cpp 子程序合集
- PixHawk学习笔记 之 源码浅析—mc_pos_control.cpp—do_control(dt)
- PixHawk学习笔记 之 源码浅析—mc_pos_control.cpp—do_control(dt)— control_manual(dt)
- PixHawk学习笔记 之 源码浅析—mc_pos_control.cpp—do_control(dt)—control_non_manual(dt)
- caffe源码c++学习笔记Classifier.cpp
- 学习笔记: 源码 caffe.cpp 初探
- 学习笔记: 源码 solver.cpp 初访
- 学习笔记: 源码 blob.cpp 初见
- 学习笔记: 源码 conv_layer.cpp 略知
- 学习笔记: 源码 pooling_layer.cpp 略懂
- 学习笔记: 源码 relu_layer.cpp 略见
- 学习笔记: 源码 inner_product_layer.cpp 略识
- 学习笔记: 源码 accuracy_layer.cpp 略明
- 学习笔记: 源码 softmax_layer.cpp 略通
- 学习笔记: 源码 multinomial_logistic_loss_layer.cpp 略晓
- 学习笔记: 源码 softmax_loss_layer.cpp 略析
- 利用Spring获得Request和Session
- EasyIndictor 一款简单易用的android导航栏
- c++之静态函数和静态方法
- 刷清橙OJ--A1001.01序列
- easyui 增加统计行
- 学习笔记: 源码 net.cpp 浅析
- 【贪心】洛谷 P1209 [USACO1.3]修理牛棚 Barn Repair
- 内存溢出怎么加内存java.lang.OutOfMemoryError:GC over head limit exceeded
- python---简单的接口测试实例
- hadoop集群默认配置和常用配置
- 按钮点击限时
- Maven安装与使用(方便自己回忆)
- Bootstrap 导航栏
- [Android]Java中System.loadLibrary() 的执行过程