Exemple #1
0
        public static Network parse_network_cfg(string filename)
        {
            Section[] sections = read_cfg(filename);
            if (sections.Length < 1)
            {
                Utils.Error("Config file has no Sections");
            }
            var        n          = sections[0];
            Network    net        = new Network(sections.Length - 1);
            SizeParams parameters = new SizeParams();

            var s       = new Section(n);
            var options = s.Options;

            if (is_network(s))
            {
                Utils.Error("First Section must be [net] or [Network]");
            }
            parse_net_options(options, net);

            parameters.H         = net.H;
            parameters.W         = net.W;
            parameters.C         = net.C;
            parameters.Inputs    = net.Inputs;
            parameters.Batch     = net.Batch;
            parameters.TimeSteps = net.TimeSteps;
            parameters.Net       = net;

            ulong workspaceSize = 0;
            var   index         = 1;
            int   count         = 0;

            Console.Error.Write("Layer     filters    size              input                output\n");
            while (index < sections.Length)
            {
                n = sections[index];
                index++;
                parameters.Index = count;
                Console.Error.Write($"{count:5} ");
                s       = new Section(n);
                options = s.Options;
                Layer     l  = new Layer();
                LayerType lt = string_to_layer_type(s.Type);
                if (lt == LayerType.Convolutional)
                {
                    l = parse_convolutional(options, parameters);
                }
                else if (lt == LayerType.Local)
                {
                    l = parse_local(options, parameters);
                }
                else if (lt == LayerType.Avgpool)
                {
                    l = parse_activation(options, parameters);
                }
                else if (lt == LayerType.Rnn)
                {
                    l = parse_rnn(options, parameters);
                }
                else if (lt == LayerType.Gru)
                {
                    l = parse_gru(options, parameters);
                }
                else if (lt == LayerType.Crnn)
                {
                    l = parse_crnn(options, parameters);
                }
                else if (lt == LayerType.Connected)
                {
                    l = parse_connected(options, parameters);
                }
                else if (lt == LayerType.Crop)
                {
                    l = parse_crop(options, parameters);
                }
                else if (lt == LayerType.Cost)
                {
                    l = parse_cost(options, parameters);
                }
                else if (lt == LayerType.Region)
                {
                    l = parse_region(options, parameters);
                }
                else if (lt == LayerType.Detection)
                {
                    l = parse_detection(options, parameters);
                }
                else if (lt == LayerType.Softmax)
                {
                    l             = parse_softmax(options, parameters);
                    net.Hierarchy = l.SoftmaxTree;
                }
                else if (lt == LayerType.Normalization)
                {
                    l = parse_normalization(options, parameters);
                }
                else if (lt == LayerType.Batchnorm)
                {
                    l = parse_batchnorm(options, parameters);
                }
                else if (lt == LayerType.Maxpool)
                {
                    l = parse_maxpool(options, parameters);
                }
                else if (lt == LayerType.Reorg)
                {
                    l = parse_reorg(options, parameters);
                }
                else if (lt == LayerType.Avgpool)
                {
                    l = parse_avgpool(options, parameters);
                }
                else if (lt == LayerType.Route)
                {
                    l = parse_route(options, parameters, net);
                }
                else if (lt == LayerType.Shortcut)
                {
                    l = parse_shortcut(options, parameters, net);
                }
                else if (lt == LayerType.Dropout)
                {
                    l           = parse_dropout(options, parameters);
                    l.Output    = net.Layers[count - 1].Output;
                    l.Delta     = net.Layers[count - 1].Delta;
                    l.OutputGpu = net.Layers[count - 1].OutputGpu;
                    l.DeltaGpu  = net.Layers[count - 1].DeltaGpu;
                }
                else
                {
                    Console.Error.Write($"LayerType not recognized: {s.Type}\n");
                }
                l.Dontload       = OptionList.option_find_int_quiet(options, "dontload", 0) != 0;
                l.Dontloadscales = OptionList.option_find_int_quiet(options, "dontloadscales", 0) != 0;
                OptionList.option_unused(options);
                net.Layers[count] = l;
                if (l.WorkspaceSize > workspaceSize)
                {
                    workspaceSize = l.WorkspaceSize;
                }
                ++count;
                if (index + 1 < sections.Length)
                {
                    parameters.H      = l.OutH;
                    parameters.W      = l.OutW;
                    parameters.C      = l.OutC;
                    parameters.Inputs = l.Outputs;
                }
            }
            net.Outputs = Network.get_network_output_size(net);
            net.Output  = Network.get_network_output(net);
            if (workspaceSize != 0)
            {
                if (CudaUtils.UseGpu)
                {
                    net.Workspace = new float[(workspaceSize - 1) / sizeof(float) + 1];
                }
                else
                {
                    net.Workspace = new float[1];
                }
            }
            return(net);
        }