private static void PackConstantsForMathOps(Model model, Dictionary <string, Layer> constantLayers) { for (int l = 0; l < model.layers.Count; ++l) { var layer = model.layers[l]; if (!LinearLayerFusing.IsLayerLinearMathOp(layer)) { continue; } var constInputs = layer.inputs.Count(x => constantLayers.ContainsKey(x)); // @TODO fuse multi const inputs here if (!(layer.inputs.Length == 2 && constInputs == 1)) { continue; } var constInput = layer.inputs.ToList().Find(x => constantLayers.ContainsKey(x)); layer.datasets = new Layer.DataSet[constantLayers[constInput].datasets.Length]; Array.Copy(constantLayers[constInput].datasets, layer.datasets, constantLayers[constInput].datasets.Length); layer.weights = new float[constantLayers[constInput].weights.Length]; Array.Copy(constantLayers[constInput].weights, layer.weights, constantLayers[constInput].weights.Length); layer.axis = constantLayers[constInput].axis; // rank TODO name correctly model.layers[l].inputs = layer.inputs.Where(x => x != constInput).ToArray(); } }
private static void UnpackConstantsForMathOps(Model model) { List <Layer> newConstants = new List <Layer>(); for (int l = 0; l < model.layers.Count; ++l) { var layer = model.layers[l]; if (!LinearLayerFusing.IsLayerLinearMathOp(layer)) { continue; } if (layer.datasets == null || layer.datasets.Length != 1) { continue; } var name = "c" + layer.name; Layer constInput = new Layer(name, Layer.Type.Load); constInput.datasets = new Layer.DataSet[layer.datasets.Length]; Array.Copy(layer.datasets, constInput.datasets, layer.datasets.Length); for (int d = 0; d < constInput.datasets.Length; ++d) { constInput.datasets[d].name = name; } constInput.weights = new float[layer.weights.Length]; Array.Copy(layer.weights, constInput.weights, layer.weights.Length); constInput.axis = layer.axis; // rank TODO rename Array.Resize(ref layer.inputs, layer.inputs.Length + 1); layer.inputs[layer.inputs.Length - 1] = constInput.name; newConstants.Add(constInput); layer.datasets = new Layer.DataSet[0]; layer.weights = new float[0]; } newConstants.AddRange(model.layers); model.layers = newConstants; }