public QuantizedMaxPool2dLayerArgument Convert(QuantizedMaxPool2d layer, ConvertContext context) { var inputRange = context.Quantization.Distributions[layer.Input.Connection.From].Global; var outputRange = context.Quantization.Distributions[layer.Output].Global; (var sa, var ba) = inputRange.GetScaleBias(8); (var so, var bo) = outputRange.GetScaleBias(8); (var mulO, var shiftO) = Quantizer.ExtractValueAndShift(so / sa, 32, 32); return(new QuantizedMaxPool2dLayerArgument { InputWidth = (uint)layer.Input.Dimensions[3], InputHeight = (uint)layer.Input.Dimensions[2], InputChannels = (uint)layer.Input.Dimensions[1], OutputWidth = (uint)layer.Output.Dimensions[3], OutputHeight = (uint)layer.Output.Dimensions[2], OutputChannels = (uint)layer.Output.Dimensions[1], KernelWidth = (uint)layer.FilterWidth, KernelHeight = (uint)layer.FilterHeight, StrideWidth = (uint)layer.StrideWidth, StrideHeight = (uint)layer.StrideHeight, PaddingWidth = (uint)Layer.GetPadding(layer.Input.Dimensions[3], layer.Output.Dimensions[3], layer.StrideWidth, 1, layer.FilterWidth), PaddingHeight = (uint)Layer.GetPadding(layer.Input.Dimensions[2], layer.Output.Dimensions[2], layer.StrideHeight, 1, layer.FilterHeight) }); }
public void Infer(QuantizedMaxPool2d layer, QuantizedMaxPool2dLayerArgument argument, InferenceContext context) { var inputAlloc = context.MainMemoryMap[layer.Input.Connection.From]; var outputAlloc = context.MainMemoryMap[layer.Output]; argument.Flags = K210LayerFlags.MainMemoryOutput; argument.MainMemoryInputAddress = inputAlloc.GetAddress(); argument.MainMemoryOutputAddress = outputAlloc.GetAddress(); }
public override void Process(TransformContext context) { var maxPool = (MaxPool2d)context.MatchedLayers[0]; var input = maxPool.Input.Connection.From.Owner.InputConnectors[0].Connection.From; var output = maxPool.Output; var quantMaxPool = new QuantizedMaxPool2d(maxPool.Input.Dimensions, maxPool.Padding, maxPool.FilterWidth, maxPool.FilterHeight, maxPool.StrideWidth, maxPool.StrideHeight, maxPool.FusedActivationFunction); var dequant = new Dequantize(quantMaxPool.Output.Dimensions); quantMaxPool.Input.SetConnection(input); dequant.Input.SetConnection(quantMaxPool.Output); var oldOuts = output.Connections.Select(o => o.To).ToList(); foreach (var oldOut in oldOuts) { oldOut.SetConnection(dequant.Output); } }