(caffe 最近又改版了,关于net 的记录边看边加上来)
net 指 training net 或者 test net
这个class 定义了包含其中的各个layer, 以及每两个layers之间的 blob
( blob 这个word刚开始怎么都不理解,后来明白是每两个layer之间的数据)
将要说下net 里的成员变量:
OVERVIEW: 1. net基本,2. layer, 3,总blob, 4, 各个layer的blob, 5, learing rate
1. name_
2. net 里的各层,这里会记录实体, 名字,序号,和是否后向
layers_ (vector<Layer>), layer_names_(vector<string>), layer_names_index_(map<string,int>), layer_need_backward(vector<bool>)
3. net 中的所有 blob, 包括实体,名字,序号, 和是否后向。
这个序号的制定顺序是: (1) txt 中的layer, (2) , 每个layer中的 bottom 或者 top
这里的 blob 算是记录下net 中出现的所有的 blob
blobs_(vextor(Blob)), blob_names_(vector(string), blob_names_index_(map<sting,int>), blob_need_backward_( vector<bool>)
4. 上面记录了所有的blob, 这里更加详细的指出每个blob 是哪个layer的 bottom or top?
这里全部有序号来指定各项,就不需要blob 的名字了。 每个layer 里分 bottom 和 top, 记录bottom or top 的时候,用的是两层嵌套的 vector
只有botttom 记录是否要 need_backward
bottom_vecs_( vector<vector<blob>>) , bottom_id_vecs_( vector<vector<int>> ) , bottom_need_backward_ ( vector<vector<bool>> )
top_vecs_( vector<vector<blob>>), top_id_vecs_( vector<vector<int>>)
不是很明白这里为什么不只用id 指定就可以了,记录实体不是重复吗?
5. 记录 learing rate 和 weight_decay
params_lr_ (vector<float>) , params_weight_decay_(vector<float>)
6. 这些我还不知道做什么的
param_owners, param_display_names_, param_layer_indices_, param_names_index_
net_input_blob_indices_, net_output_blob_indices_, net_input_blobs, net_output_blobs_
Init 过程
1. (1) 先做 filtered, 把 exclude 排除掉 (include 和 exclude 都事先定义了)。 然后 InsertSplits(), 这个函数还不明白
(2) 先检查 input_blob, 一般 train 和 test 没有, 在deploy 里有
2. for ( each layer ) {
(1) update layers_ , layer_names_,
(2) 事实上先有top, 再有bottom
总的来说,在top 中先更新总的blob, 更新top, 再更新bottom
AppendBottom 加入这个layer的bottom blob
(1) 检查下 available_blob
(2) 压入bottom, bottom_vecs_, bottom_id_vecs
(3) 删除 available
(4) 更新 bottom_need_backward_ (都是false)
AppendTop 加入layer的top blob
(1) 更新总的blob, blobs_, blob_names_, blob_need_backward_, blob_name_to_idx
blob 的 blob_need_backward 都是false
(2) 压入 top, top_vecs_, top_id_vecs_
(3) 加入 available_blob
(3) 每个layer 的 Setup(), 建立这个layer的 top和bottom的关系
输出 top shape
(4) 查看是否有 blob_lr (blob_lr大于0 说明是要need_backward)
更新 need_backward
(5) share_mode_size 还没看懂
(6) 压入 layer_need_backward_ , 判断这个layer 要不要更新
关于这个layer 的 top 层都要 need_backward
}
3. 是否强制 backward
4. 剩下的 blob 被认为是 output blob
5. GetLearningRateAndWeightDecay()
检查每一个layer的定义,看有没有 lr 和 weight , 大于0 就说有。 没有定义的,指定为1.0