Beispiel #1
0
        private Layer ConvertPool2d(paddle.OpDesc op)
        {
            var type    = GetAttr(op, "pooling_type").S;
            var ksize   = GetAttr(op, "ksize").Ints;
            var strides = GetAttr(op, "strides").Ints;
            var x       = op.Inputs[0].Arguments[0];
            var output  = op.Outputs[0].Arguments[0];

            if (GetAttr(op, "global_pooling").B)
            {
                var shape = GetVarShape(x);
                ksize[0] = shape[2];
                ksize[1] = shape[3];
            }

            if (type == "avg")
            {
                var layer = new AveragePool2d(GetVarShape(x), Padding.Valid, ksize[1], ksize[0], strides[1], strides[0], ActivationFunctionType.Linear);
                _inputs.Add(layer.Input, x);
                _outputs.Add(output, layer.Output);
                return(layer);
            }
            else if (type == "max")
            {
                var layer = new MaxPool2d(GetVarShape(x), Padding.Valid, ksize[1], ksize[0], strides[1], strides[0], ActivationFunctionType.Linear);
                _inputs.Add(layer.Input, x);
                _outputs.Add(output, layer.Output);
                return(layer);
            }
            else
            {
                throw new NotSupportedException();
            }
        }
Beispiel #2
0
        public void Infer(AveragePool2d layer, AveragePool2dLayerArgument 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();
        }
Beispiel #3
0
        private Layer ConvertAveragePool2d(tflite.Operator op)
        {
            var inputs  = op.GetInputsArray();
            var input   = _graph.Tensors(inputs[0]).Value;
            var options = op.BuiltinOptions <tflite.Pool2DOptions>().Value;

            var layer = new AveragePool2d(input.GetShapeArray().ToNCHW(), options.Padding.ToPadding(), options.FilterWidth, options.FilterHeight, options.StrideW,
                                          options.StrideH, options.FusedActivationFunction.ToActivationFunction());

            _inputs.Add(layer.Input, inputs[0]);
            _outputs.Add(op.Outputs(0), layer.Output);
            return(layer);
        }
Beispiel #4
0
 public AveragePool2dLayerArgument Convert(AveragePool2d layer, ConvertContext context)
 {
     return(new AveragePool2dLayerArgument
     {
         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),
         Activation = layer.FusedActivationFunction
     });
 }
        private Layer ConvertPooling(LayerParameter layerParam)
        {
            var input = _outputs[layerParam.Bottom[0]];
            var param = layerParam.PoolingParam;

            var ksizes   = GetCaffeSize(param.KernelH, param.KernelW, param.KernelSize);
            var strides  = GetCaffeSize(param.StrideH, param.StrideW, param.Stride);
            var paddings = GetCaffeSize(param.PadH, param.PadW, param.Pad);

            if (param.GlobalPooling)
            {
                ksizes[0]   = (uint)input.Dimensions[2];
                ksizes[1]   = (uint)input.Dimensions[3];
                strides[0]  = strides[1] = 1;
                paddings[0] = paddings[1] = 0;
            }

            if (paddings[0] != paddings[1] || (paddings[0] != 0 && paddings[0] != 1))
            {
                throw new NotSupportedException("Custom paddings are not supprted.");
            }

            Padding padding = paddings[0] == 0 ? Padding.Valid : Padding.Same;

            if (param.Pool == PoolingParameter.Types.PoolMethod.Ave)
            {
                var layer = new AveragePool2d(input.Dimensions, padding, (int)ksizes[1], (int)ksizes[0], (int)strides[1], (int)strides[0], ActivationFunctionType.Linear);
                layer.Input.SetConnection(input);
                _outputs[layerParam.Top[0]] = layer.Output;
                return(layer);
            }
            else if (param.Pool == PoolingParameter.Types.PoolMethod.Max)
            {
                var layer = new MaxPool2d(input.Dimensions, padding, (int)ksizes[1], (int)ksizes[0], (int)strides[1], (int)strides[0], ActivationFunctionType.Linear);
                layer.Input.SetConnection(input);
                _outputs[layerParam.Top[0]] = layer.Output;
                return(layer);
            }
            else
            {
                throw new LayerNotSupportedException(param.Pool.ToString());
            }
        }