/// <summary>
        /// Builds the config, which consists of the node graph and serialized layers.
        /// </summary>
        ModelConfig get_network_config()
        {
            var config = new ModelConfig
            {
                Name = name
            };

            var node_conversion_map = new Dictionary <string, int>();

            foreach (var layer in _layers)
            {
                var kept_nodes = _should_skip_first_node(layer) ? 1 : 0;
                foreach (var(original_node_index, node) in enumerate(layer.InboundNodes))
                {
                    var node_key = _make_node_key(layer.Name, original_node_index);
                    if (NetworkNodes.Contains(node_key))
                    {
                        node_conversion_map[node_key] = kept_nodes;
                        kept_nodes += 1;
                    }
                }
            }

            var layer_configs = new List <LayerConfig>();

            foreach (var layer in _layers)
            {
                var filtered_inbound_nodes = new List <NodeConfig>();
                foreach (var(original_node_index, node) in enumerate(layer.InboundNodes))
                {
                    var node_key = _make_node_key(layer.Name, original_node_index);
                    if (NetworkNodes.Contains(node_key) && !node.is_input)
                    {
                        var node_data = node.serialize(_make_node_key, node_conversion_map);
                        filtered_inbound_nodes.append(node_data);
                    }
                }

                var layer_config = generic_utils.serialize_keras_object(layer);
                layer_config.Name         = layer.Name;
                layer_config.InboundNodes = filtered_inbound_nodes;
                layer_configs.Add(layer_config);
            }
            config.Layers = layer_configs;

            // Gather info about inputs and outputs.
            var model_inputs = new List <NodeConfig>();

            foreach (var i in range(_input_layers.Count))
            {
                var(layer, node_index, tensor_index) = _input_coordinates[i];
                var node_key = _make_node_key(layer.Name, node_index);
                if (!NetworkNodes.Contains(node_key))
                {
                    continue;
                }
                var new_node_index = node_conversion_map[node_key];
                model_inputs.append(new NodeConfig
                {
                    Name        = layer.Name,
                    NodeIndex   = new_node_index,
                    TensorIndex = tensor_index
                });
            }
            config.InputLayers = model_inputs;

            var model_outputs = new List <NodeConfig>();

            foreach (var i in range(_output_layers.Count))
            {
                var(layer, node_index, tensor_index) = _output_coordinates[i];
                var node_key = _make_node_key(layer.Name, node_index);
                if (!NetworkNodes.Contains(node_key))
                {
                    continue;
                }
                var new_node_index = node_conversion_map[node_key];
                model_outputs.append(new NodeConfig
                {
                    Name        = layer.Name,
                    NodeIndex   = new_node_index,
                    TensorIndex = tensor_index
                });
            }
            config.OutputLayers = model_outputs;

            return(config);
        }