public override void Process(TransformContext context) { var concat = (ExclusiveConcatenation)context.MatchedLayers[0]; var output = concat.Output; var exConcat = new QuantizedExclusiveConcatenation(concat.Inputs.Select(x => new ReadOnlyMemory <int>(x.Dimensions.ToArray()))); for (int i = 0; i < exConcat.Inputs.Count; i++) { var input = concat.Inputs[i].Connection.From; var quantize = new Quantize(input.Dimensions); var requantize = new Requantize(quantize.Output.Dimensions); quantize.Input.SetConnection(input); requantize.Input.SetConnection(quantize.Output); exConcat.Inputs[i].SetConnection(requantize.Output); } var dequantize = new Dequantize(exConcat.Output.Dimensions); dequantize.Input.SetConnection(exConcat.Output); var oldOuts = output.Connections.Select(o => o.To).ToList(); foreach (var oldOut in oldOuts) { oldOut.SetConnection(dequantize.Output); } }
public void FixupQuantization(QuantizedExclusiveConcatenation layer, QuantizationContext context) { var outRange = context.Distributions[layer.Output]; foreach (var input in layer.Inputs.Select(x => x.Connection.From)) { context.Distributions[input] = outRange; } }
public void AllocateInputMemory(QuantizedExclusiveConcatenation layer, OutputConnector input, InferenceContext context) { var totalAlloc = context.GetOrAllocateMainMemory(layer.Output); uint offset = 0; foreach (var node in layer.Inputs.Select(x => x.Connection.From)) { if (context.MainMemoryMap.ContainsKey(node)) { return; } uint size = (uint)node.Dimensions.GetSize(); context.MainMemoryMap.Add(node, new MemoryAllocation(totalAlloc.Node, offset, size)); offset += size; } }