l = parse_dropout(options, params);函数主体
dropout_layer parse_dropout(list *options, size_params params)
{
float probability = option_find_float(options, "probability", .5);//保留多少参数
dropout_layer layer = make_dropout_layer(params.batch, params.inputs, probability);//核心函数
//配置输出特征图的尺寸,与输入相同
layer.out_w = params.w;
layer.out_h = params.h;
layer.out_c = params.c;
return layer;
}
dropout_layer layer = make_dropout_layer(params.batch, params.inputs, probability);函数主体
dropout_layer make_dropout_layer(int batch, int inputs, float probability)
{
dropout_layer l = {0};//定义dropout层并初始化0
l.type = DROPOUT;//此层的名字
l.probability = probability;//保留概率
l.inputs = inputs;//输入
l.outputs = inputs;//输出,这里与输入相同
l.batch = batch;//min_batch
l.rand = calloc(inputs*batch, sizeof(float));//为min_batch特征图分配空间
l.scale = 1./(1.-probability);
l.forward = forward_dropout_layer;//令函数指针指向forward_dropout_layer函数入口地址
l.backward = backward_dropout_layer;;//令函数指针指向backward_dropout_layer函数入口地址
#ifdef GPU//若定义了GPU则运行下面高效率代码
l.forward_gpu = forward_dropout_layer_gpu;
l.backward_gpu = backward_dropout_layer_gpu;
l.rand_gpu = cuda_make_array(l.rand, inputs*batch);
#endif
fprintf(stderr, "dropout p = %.2f %4d -> %4d\n", probability, inputs, inputs);
return l;
}