MCPcopy
hub / github.com/OpenPPL/ppq / AveragePool_forward

Function AveragePool_forward

ppq/executor/op/torch/default.py:762–813  ·  view source on GitHub ↗
(op: Operation, values: List[torch.Tensor], ctx: TorchBackendContext = None, **kwargs)

Source from the content-addressed store, hash-verified

760
761
762def AveragePool_forward(op: Operation, values: List[torch.Tensor], ctx: TorchBackendContext = None, **kwargs) -> torch.Tensor:
763 ASSERT_NUM_OF_INPUT(op=op, values=values, min_num_of_input=1, max_num_of_input=1)
764 process_attribute(op.attributes, values[0].shape[2:])
765
766 [x] = values
767 onnx_pads = GET_ATTRIBUTE_FROM_OPERATION(op=op, attribute='pads', default=0)
768 stride = GET_ATTRIBUTE_FROM_OPERATION(op=op, attribute='strides', default=None)
769 ceil_mode = bool(GET_ATTRIBUTE_FROM_OPERATION(op=op, attribute='ceil_mode', default=False))
770 if op.type == 'GlobalAveragePool': kernel_size = x.size()[2:]
771 else: kernel_size = GET_ATTRIBUTE_FROM_OPERATION(op=op, attribute='kernel_shape', compulsive=True)
772
773 ndim = x.ndim
774 # pool 1d
775 if ndim == 3:
776 torch_pads = convert_onnx_pads_to_torch(onnx_pads=onnx_pads, mode='1d')
777 if isinstance(torch_pads, list) and len(torch_pads) != 1:
778 x = F.pad(x, torch_pads)
779 torch_pads = 0
780 output = F.avg_pool1d(
781 x, kernel_size=kernel_size, padding=torch_pads,
782 stride=stride, ceil_mode=ceil_mode)
783 return output
784 # pool 2d
785 if ndim == 4:
786 # onnx pads format[top, left, bottom, right] to torch pads format[left, right, top, bottom]
787 if isinstance(onnx_pads, list) and len(onnx_pads) == 4:
788 p_left, p_right, p_top, p_bottom = onnx_pads[1], onnx_pads[3], onnx_pads[0], onnx_pads[2]
789 # torch does not support padding contains 4 value, there is a fix of it.
790 if p_left == p_right and p_top == p_bottom:
791 onnx_pads = [p_top, p_left]
792 else:
793 x = F.pad(x, pad=[p_left, p_right, p_top, p_bottom])
794 onnx_pads = 0
795
796 output = F.avg_pool2d(
797 x, kernel_size=kernel_size,
798 padding=onnx_pads, stride=stride, ceil_mode=ceil_mode)
799 return output
800 # pool 3d
801 elif ndim == 5:
802 torch_pads = convert_onnx_pads_to_torch(onnx_pads=onnx_pads, mode='3d')
803 if isinstance(torch_pads, list) and len(torch_pads) != 3:
804 x = F.pad(x, torch_pads)
805 torch_pads = 0
806 output = F.avg_pool3d(
807 x, kernel_size=kernel_size, padding=torch_pads,
808 stride=stride, ceil_mode=ceil_mode)
809 return output
810 else:
811 raise ValueError(f'Operation {op.name} is invalid, {ndim}-d input is not supported.')
812
813 return output
814
815
816def AdaptiveAvgPool2d_forward(op: Operation, values: List[torch.Tensor], ctx: TorchBackendContext = None, **kwargs) -> torch.Tensor:

Callers

nothing calls this directly

Calls 4

process_attributeFunction · 0.90
ASSERT_NUM_OF_INPUTFunction · 0.85

Tested by

no test coverage detected