示例#1
0
        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)
            });
        }
示例#2
0
        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();
        }
示例#3
0
        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);
            }
        }