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); }