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

1. 初始化函数
template <typename Dtype>
void Net<Dtype>::Init(const NetParameter& in_param) {
...
map<string, int> blob_name_to_idx; //Blob名与index的map
set<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 blob
AppendParam(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 了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值