l = parse_local(options, params);

29 篇文章 1 订阅
27 篇文章 2 订阅

l = parse_local(options, params);函数主体

local_layer parse_local(list *options, size_params params)
{
	//设置网络参数
    int n = option_find_int(options, "filters",1);
    int size = option_find_int(options, "size",1);
    int stride = option_find_int(options, "stride",1);
    int pad = option_find_int(options, "pad",0);
    char *activation_s = option_find_str(options, "activation", "logistic");
    ACTIVATION activation = get_activation(activation_s);

    int batch,h,w,c;
    h = params.h;
    w = params.w;
    c = params.c;
    batch=params.batch;
    if(!(h && w && c)) error("Layer before local layer must output image.");
	//创建local层
    local_layer layer = make_local_layer(batch,h,w,c,n,size,stride,pad,activation);

    return layer;
}

local_layer layer = make_local_layer(batch,h,w,c,n,size,stride,pad,activation);函数主体

local_layer make_local_layer(int batch, int h, int w, int c, int n, int size, int stride, int pad, ACTIVATION activation)
{
    int i;
    local_layer l = {0};//定义结构体local_layer l并初始化为0
    l.type = LOCAL;//该网络层的名字
	//设置输入特征图的参数
    l.h = h;
    l.w = w;
    l.c = c;
    l.n = n;
    l.batch = batch;
    l.stride = stride;
    l.size = size;
    l.pad = pad;
	//设置输出特征图参数,
    int out_h = local_out_height(l);
    int out_w = local_out_width(l);
    /*由于这里pad=1,stride=1所以运行后h不变
	int local_out_height(local_layer l)
	{
    	int h = l.h;
    	if (!l.pad) h -= l.size;
   	 	else h -= 1;
    	return h/l.stride + 1;
	}
	*/
	//设置输出参数
    int locations = out_h*out_w;
    l.out_h = out_h;
    l.out_w = out_w;
    l.out_c = n;
    l.outputs = l.out_h * l.out_w * l.out_c;
    l.inputs = l.w * l.h * l.c;
	//为权重分配空间,这里不再是使用卷积,所以权重参数多了很多,这里就可以看出卷积的好处了
    l.weights = calloc(c*n*size*size*locations, sizeof(float));
    l.weight_updates = calloc(c*n*size*size*locations, sizeof(float));

    l.biases = calloc(l.outputs, sizeof(float));
    l.bias_updates = calloc(l.outputs, sizeof(float));

    // float scale = 1./sqrt(size*size*c);
    // 初始化权重:缩放因子*标准均匀分布随机数(-1,1)之间,缩放因子等于sqrt(2./(size*size*c)),
    float scale = sqrt(2./(size*size*c));
    for(i = 0; i < c*n*size*size; ++i) l.weights[i] = scale*rand_uniform(-1,1);

    l.output = calloc(l.batch*out_h * out_w * n, sizeof(float));//为该层所有的输出(包括mini-batch所有输入图片的输出)分配空间
    l.delta  = calloc(l.batch*out_h * out_w * n, sizeof(float));

    l.workspace_size = out_h*out_w*size*size*c;//一个滤波器生成一个特征图的参数数量
    //核心代码,设置前行后向和更新的卷积网络,令函数指针 l.forward l.backward  l.update都设置指向函数,这里只是将函数指针指向函数入口地址,并不会运行,会在之后加载模型和网络是使用
    l.forward = forward_local_layer;
    l.backward = backward_local_layer;
    l.update = update_local_layer;

#ifdef GPU//若是定义了GPU,则运行此处高效率代码
    l.forward_gpu = forward_local_layer_gpu;
    l.backward_gpu = backward_local_layer_gpu;
    l.update_gpu = update_local_layer_gpu;

    l.weights_gpu = cuda_make_array(l.weights, c*n*size*size*locations);
    l.weight_updates_gpu = cuda_make_array(l.weight_updates, c*n*size*size*locations);

    l.biases_gpu = cuda_make_array(l.biases, l.outputs);
    l.bias_updates_gpu = cuda_make_array(l.bias_updates, l.outputs);

    l.delta_gpu = cuda_make_array(l.delta, l.batch*out_h*out_w*n);
    l.output_gpu = cuda_make_array(l.output, l.batch*out_h*out_w*n);

#endif
    l.activation = activation;//设置激活函数

    fprintf(stderr, "Local Layer: %d x %d x %d image, %d filters -> %d x %d x %d image\n", h,w,c,n, out_h, out_w, n);

    return l;
}
在Python中,`if __name__ == '__main__':`是一个常见的代码块,它用于判断当前模块是否作为主程序运行。当模块作为主程序运行时,`__name__`的值会被设置为`'__main__'`,因此这个条件语句会成立。 在这个代码块中,通常会执行一些初始化操作,并调用主函数来执行程序的主要逻辑。根据提供的引用内容,可以推测出以下步骤: 1. 解析命令行参数:根据引用中的`int main(int argc, char** argv)`可以看出,`main()`函数接受两个参数,分别是命令行参数的数量和参数列表。因此,在`if __name__ == '__main__':`代码块中,可能会调用一个名为`parse_opt()`的函数来解析命令行参数,并将返回的参数对象赋值给`op_t`变量。 2. 执行初始化操作:根据引用中的描述,`main()`函数执行了一个名为`initialize_logging()`的内部函数来进行日志初始化操作。这个函数可能用于设置日志的格式、输出位置等。 3. 执行主函数逻辑:在`if __name__ == '__main__':`代码块中,可能会调用一个名为`main()`的函数,将解析后的命令行参数对象作为参数传递给它。这个函数可能包含了程序的主要逻辑,用于处理命令行参数并执行相应的操作。 下面是一个示例代码,演示了如何使用`if __name__ == '__main__':`代码块来执行上述步骤: ```python def parse_opt(): # 解析命令行参数的逻辑 ... def initialize_logging(): # 日志初始化操作的逻辑 ... def main(op_t): # 主函数的逻辑 ... if __name__ == '__main__': op_t = parse_opt() initialize_logging() main(op_t) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值