整个网络的构建从load_network(cfgfile, weightfile, clear);函数开始,从cfg文件中读取网络配置文件,分配好内存,加载预训练好的权重:
network *load_network(char *cfg, char *weights, int clear)
{
network *net = parse_network_cfg(cfg);
if(weights && weights[0] != 0){
load_weights(net, weights);
}
if(clear) (*net->seen) = 0;
return net;
}
network *parse_network_cfg(char *filename)函数由下面几个步骤组成:
1.read_cfg(filename);//将网络构图读入到内存结构链表中
2.make_network(sections->size - 1);//创建网络结构
3.parse_net_options(options, net);//设置总体网络参数
4.依次读取各个层,来构建各个层while(n){
通过下面这条语句来实现整个网络各个层之间输入与上层输出大小对应起来
if(n){
params.h = l.out_h;
params.w = l.out_w;
params.c = l.out_c;
params.inputs = l.outputs;
}
通过如下将最后一层的输出作为整个网络的输出:
layer out = get_network_output_layer(net);
net->outputs = out.outputs;
net->truths = out.outputs;
if(net->layers[net->n-1].truths) net->truths = net->layers[net->n-1].truths;
net->output = out.output;
为整个第一层网络的输入分配内存
net->input = calloc(net->inputs*net->batch, sizeof(float));
为最后的truth分配内存
net->truth = calloc(net->truths*net->batch, sizeof(float));
}