Пример #1
0
        private Layer ConvertLeakyRelu(tflite.Operator op)
        {
            var inputs  = op.GetInputsArray();
            var input   = _graph.Tensors(inputs[0]).Value;
            var options = op.BuiltinOptions <tflite.LeakyReluOptions>().Value;

            var layer = new LeakyRelu(input.GetShapeArray().ToNCHW(), options.Alpha);

            _inputs.Add(layer.Input, inputs[0]);
            _outputs.Add(op.Outputs(0), layer.Output);
            return(layer);
        }
Пример #2
0
        public override void Process(TransformContext context)
        {
            var mul    = (Mul)context.MatchedLayers[0];
            var max    = (Maximum)context.MatchedLayers[1];
            var input  = mul.Input.Connection.From;
            var output = max.Output;

            var leaky = new LeakyRelu(input.Dimensions, (float)mul.Scale);

            leaky.Input.SetConnection(input);

            var oldOuts = output.Connections.Select(o => o.To).ToList();

            foreach (var oldOut in oldOuts)
            {
                oldOut.SetConnection(leaky.Output);
            }
        }
Пример #3
0
        public override void Process(TransformContext context)
        {
            var space    = context.MatchedLayers[0];
            var dwConv2d = (DepthwiseConv2d)context.MatchedLayers[1];
            var conv2d   = (Conv2d)context.MatchedLayers.Last();
            var input    = space.InputConnectors[0].Connection.From;
            var output   = conv2d.Output;

            space.InputConnectors[0].ClearConnection();
            var newDwConv2d = new DepthwiseConv2d(input.Dimensions, dwConv2d.Weights, dwConv2d.Bias, Padding.Same, 1, 1, dwConv2d.FusedActivationFunction);
            var quantize    = new Quantize(newDwConv2d.Output.Dimensions);
            var upload      = new K210Upload(quantize.Output.Dimensions);
            var newConv2d   = new K210Conv2d(upload.Output.Dimensions, K210Conv2dType.Conv2d, conv2d.Weights, conv2d.Bias, K210PoolType.LeftTop, conv2d.FusedActivationFunction, null);
            var dequantize  = new Dequantize(newConv2d.Output.Dimensions);

            newDwConv2d.Input.SetConnection(input);
            quantize.Input.SetConnection(newDwConv2d.Output);
            upload.Input.SetConnection(quantize.Output);
            newConv2d.Input.SetConnection(upload.Output);
            dequantize.Input.SetConnection(newConv2d.Output);

            var oldOuts = output.Connections.Select(o => o.To).ToList();

            if (context.MatchedLayers.Count == 3)
            {
                foreach (var oldOut in oldOuts)
                {
                    oldOut.SetConnection(dequantize.Output);
                }
            }
            else
            {
                var newOutput = dequantize.Output;

                foreach (var middleLayer in context.MatchedLayers.Skip(2).Take(context.MatchedLayers.Count - 3))
                {
                    Layer newLayer;
                    switch (middleLayer)
                    {
                    case Quantize _:
                        newLayer = new Quantize(newOutput.Dimensions);
                        break;

                    case Dequantize _:
                        newLayer = new Dequantize(newOutput.Dimensions);
                        break;

                    case LeakyRelu l:
                        newLayer = new LeakyRelu(newOutput.Dimensions, l.Slope);
                        break;

                    default:
                        throw new NotImplementedException();
                    }

                    newLayer.InputConnectors[0].SetConnection(newOutput);
                    newOutput = newLayer.OutputConnectors[0];
                }

                foreach (var oldOut in oldOuts)
                {
                    oldOut.SetConnection(newOutput);
                }
            }
        }