407 lines
12 KiB
Python
407 lines
12 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
"""TVM operator pooling compute."""
|
|
|
|
from .. import cpp
|
|
|
|
POOL_TYPE_CODE = {"avg": 0, "max": 1}
|
|
|
|
|
|
def global_pool(data, pool_type, layout="NCHW"):
|
|
"""Perform global pooling on height and width dimension of data.
|
|
It decides the height and width dimension according to the layout string,
|
|
in which 'W' and 'H' means width and height respectively.
|
|
Width and height dimension cannot be split.
|
|
For example, NCHW, NCHW16c, etc. are valid for pool,
|
|
while NCHW16w, NCHW16h are not.
|
|
See parameter `layout` for more information of the layout string convention.
|
|
|
|
Parameters
|
|
----------
|
|
data : tvm.te.Tensor
|
|
n-D with shape of layout
|
|
|
|
pool_type : str
|
|
Pool type, 'max' or 'avg'
|
|
|
|
layout : str
|
|
Layout of the input data.
|
|
The layout is supposed to be composed of upper cases, lower cases and numbers,
|
|
where upper case indicates a dimension and
|
|
the corresponding lower case with factor size indicates the split dimension.
|
|
For example, NCHW16c can describe a 5-D tensor of
|
|
[batch_size, channel, height, width, channel_block],
|
|
in which channel_block=16 is a split of dimension channel.
|
|
|
|
Returns
|
|
-------
|
|
output : tvm.te.Tensor
|
|
n-D in same layout with height and width dimension size of 1.
|
|
e.g., for NCHW, the output shape will be [batch, channel, 1, 1]
|
|
"""
|
|
return cpp.nn.global_pool(data, POOL_TYPE_CODE[pool_type], layout)
|
|
|
|
|
|
def pool_grad(
|
|
grads,
|
|
data,
|
|
kernel,
|
|
stride,
|
|
padding,
|
|
pool_type,
|
|
ceil_mode=False,
|
|
count_include_pad=True,
|
|
layout="NCHW",
|
|
):
|
|
"""Gradient of pooling on height and width dimension of data.
|
|
It decides the height and width dimension according to the layout string,
|
|
in which 'W' and 'H' means width and height respectively.
|
|
Width and height dimension cannot be split.
|
|
For example, NCHW, NCHW16c, etc. are valid for pool,
|
|
while NCHW16w, NCHW16h are not.
|
|
See parameter `layout` for more information of the layout string convention.
|
|
|
|
Parameters
|
|
----------
|
|
grads : tvm.te.Tensor
|
|
n-D with shape of layout
|
|
|
|
data : tvm.te.Tensor
|
|
n-D with shape of layout
|
|
|
|
kernel : list/tuple of two ints
|
|
Kernel size, [kernel_height, kernel_width]
|
|
|
|
stride : list/tuple of two ints
|
|
Stride size, [stride_height, stride_width]
|
|
|
|
padding : list/tuple of four ints
|
|
Pad size, [pad_top, pad_left, pad_bottom, pad_right]]
|
|
|
|
pool_type : str
|
|
Pool type, 'max' or 'avg'
|
|
|
|
ceil_mode : bool
|
|
Whether to use ceil when calculating output size.
|
|
|
|
count_include_pad: bool
|
|
Whether include padding in the calculation when pool_type is 'avg'
|
|
|
|
layout: string
|
|
Layout of the input data.
|
|
The layout is supposed to be composed of upper cases, lower cases and numbers,
|
|
where upper case indicates a dimension and
|
|
the corresponding lower case with factor size indicates the split dimension.
|
|
For example, NCHW16c can describe a 5-D tensor of
|
|
[batch_size, channel, height, width, channel_block],
|
|
in which channel_block=16 is a split of dimension channel.
|
|
|
|
|
|
Returns
|
|
-------
|
|
output : tvm.te.Tensor
|
|
n-D in the same layout
|
|
"""
|
|
return cpp.nn.pool_grad(
|
|
grads,
|
|
data,
|
|
kernel,
|
|
stride,
|
|
padding,
|
|
POOL_TYPE_CODE[pool_type],
|
|
ceil_mode,
|
|
layout,
|
|
count_include_pad,
|
|
)
|
|
|
|
|
|
def adaptive_pool(data, output_size, pool_type, layout="NCHW"):
|
|
"""Perform pooling on height and width dimension of data.
|
|
The pooling kernel and stride sizes are automatically chosen for desired
|
|
output sizes.
|
|
It decides the height and width dimension according to the layout string,
|
|
in which 'W' and 'H' means width and height respectively.
|
|
Width and height dimension cannot be split.
|
|
For example, NCHW, NCHW16c, etc. are valid for pool,
|
|
while NCHW16w, NCHW16h are not.
|
|
See parameter `layout` for more information of the layout string convention.
|
|
|
|
Parameters
|
|
----------
|
|
data : tvm.te.Tensor
|
|
n-D with shape of layout
|
|
|
|
output_size : tuple of int
|
|
output height and width.
|
|
|
|
pool_type : str
|
|
Pool type, 'max' or 'avg'
|
|
|
|
layout: string
|
|
Layout of the input data.
|
|
The layout is supposed to be composed of upper cases, lower cases and numbers,
|
|
where upper case indicates a dimension and
|
|
the corresponding lower case with factor size indicates the split dimension.
|
|
For example, NCHW16c can describe a 5-D tensor of
|
|
[batch_size, channel, height, width, channel_block],
|
|
in which channel_block=16 is a split of dimension channel.
|
|
|
|
Returns
|
|
-------
|
|
output : tvm.te.Tensor
|
|
n-D in the same layout
|
|
"""
|
|
return cpp.nn.adaptive_pool(data, output_size, POOL_TYPE_CODE[pool_type], layout)
|
|
|
|
|
|
def adaptive_pool1d(data, output_size, pool_type, layout="NCW"):
|
|
"""Perform pooling on three dimensional data.
|
|
See the two dimensional version above for details.
|
|
"""
|
|
return cpp.nn.adaptive_pool1d(data, output_size, POOL_TYPE_CODE[pool_type], layout)
|
|
|
|
|
|
def adaptive_pool3d(data, output_size, pool_type, layout="NCDHW"):
|
|
"""Perform pooling on three dimensional data.
|
|
See the two dimensional version above for details.
|
|
"""
|
|
return cpp.nn.adaptive_pool3d(data, output_size, POOL_TYPE_CODE[pool_type], layout)
|
|
|
|
|
|
def pool1d(
|
|
data,
|
|
kernel,
|
|
stride,
|
|
dilation,
|
|
padding,
|
|
pool_type,
|
|
ceil_mode=False,
|
|
layout="NCW",
|
|
count_include_pad=True,
|
|
):
|
|
"""Perform pooling on width dimension of data.
|
|
Width axis is determined according to the layout string.
|
|
in which 'w' means width.
|
|
Width dimension cannot be split.
|
|
For example, NCW, NCW16c, etc. are valid for pool,
|
|
while NCW16w is not.
|
|
See parameter `layout` for more information of the layout string convention.
|
|
|
|
Parameters
|
|
----------
|
|
data : tvm.te.Tensor
|
|
n-D with shape of layout
|
|
|
|
kernel : list/tuple of one int or int
|
|
Kernel size, [kernel_width]
|
|
|
|
stride : list/tuple of one int or int
|
|
Stride size, [stride_width]
|
|
|
|
dilation: list/tuple of two ints
|
|
Dilation size, [dilation_height, dilation_width]
|
|
|
|
padding : list/tuple of two ints
|
|
Pad size, [pad_left, pad_right]
|
|
|
|
pool_type : str
|
|
Pool type, 'max' or 'avg'
|
|
|
|
ceil_mode : bool
|
|
Whether to use ceil when calculating output size.
|
|
|
|
layout: string
|
|
Layout of the input data.
|
|
The layout is supposed to be composed of upper cases, lower cases and numbers,
|
|
where upper case indicates a dimension and
|
|
the corresponding lower case with factor size indicates the split dimension.
|
|
For example, NCW16c can describe a 4-D tensor of
|
|
[batch_size, channel, width, channel_block],
|
|
in which channel_block=16 is a split of dimension channel.
|
|
|
|
count_include_pad: bool
|
|
Whether include padding in the calculation when pool_type is 'avg'
|
|
|
|
Returns
|
|
-------
|
|
output : tvm.te.Tensor
|
|
n-D in the same layout
|
|
"""
|
|
if isinstance(kernel, int):
|
|
kernel = [
|
|
kernel,
|
|
]
|
|
if isinstance(stride, int):
|
|
stride = [
|
|
stride,
|
|
]
|
|
return cpp.nn.pool1d(
|
|
data,
|
|
kernel,
|
|
stride,
|
|
dilation,
|
|
padding,
|
|
POOL_TYPE_CODE[pool_type],
|
|
ceil_mode,
|
|
layout,
|
|
count_include_pad,
|
|
)
|
|
|
|
|
|
def pool2d(
|
|
data,
|
|
kernel,
|
|
stride,
|
|
dilation,
|
|
padding,
|
|
pool_type,
|
|
ceil_mode=False,
|
|
layout="NCHW",
|
|
count_include_pad=True,
|
|
):
|
|
"""Perform pooling on height and width dimension of data.
|
|
It decides the height and width dimension according to the layout string,
|
|
in which 'W' and 'H' means width and height respectively.
|
|
Width and height dimension cannot be split.
|
|
For example, NCHW, NCHW16c, etc. are valid for pool,
|
|
while NCHW16w, NCHW16h are not.
|
|
See parameter `layout` for more information of the layout string convention.
|
|
|
|
Parameters
|
|
----------
|
|
data : tvm.te.Tensor
|
|
n-D with shape of layout
|
|
|
|
kernel : list/tuple of two ints
|
|
Kernel size, [kernel_height, kernel_width]
|
|
|
|
stride : list/tuple of two ints
|
|
Stride size, [stride_height, stride_width]
|
|
|
|
dilation: list/tuple of two ints
|
|
Dilation size, [dilation_height, dilation_width]
|
|
|
|
padding : list/tuple of four ints
|
|
Pad size, [pad_top, pad_left, pad_bottom, pad_right]]
|
|
|
|
pool_type : str
|
|
Pool type, 'max' or 'avg'
|
|
|
|
ceil_mode : bool
|
|
Whether to use ceil when calculating output size.
|
|
|
|
layout: string
|
|
Layout of the input data.
|
|
The layout is supposed to be composed of upper cases, lower cases and numbers,
|
|
where upper case indicates a dimension and
|
|
the corresponding lower case with factor size indicates the split dimension.
|
|
For example, NCHW16c can describe a 5-D tensor of
|
|
[batch_size, channel, height, width, channel_block],
|
|
in which channel_block=16 is a split of dimension channel.
|
|
|
|
count_include_pad: bool
|
|
Whether include padding in the calculation when pool_type is 'avg'
|
|
|
|
Returns
|
|
-------
|
|
output : tvm.te.Tensor
|
|
n-D in the same layout
|
|
"""
|
|
return cpp.nn.pool2d(
|
|
data,
|
|
kernel,
|
|
stride,
|
|
dilation,
|
|
padding,
|
|
POOL_TYPE_CODE[pool_type],
|
|
ceil_mode,
|
|
layout,
|
|
count_include_pad,
|
|
)
|
|
|
|
|
|
def pool3d(
|
|
data,
|
|
kernel,
|
|
stride,
|
|
dilation,
|
|
padding,
|
|
pool_type,
|
|
ceil_mode=False,
|
|
layout="NCDHW",
|
|
count_include_pad=True,
|
|
):
|
|
"""Perform pooling on depth, height and width dimension of data.
|
|
It decides the depth, height and width dimension according to the layout string,
|
|
in which 'D', 'W' and 'H' means depth, width and height respectively.
|
|
Depth, width and height dimension cannot be split.
|
|
For example, NCDHW, NCDHW16c, etc. are valid for pool,
|
|
while NCDHW16d, NCDHW16w, NCDHW16h are not.
|
|
See parameter `layout` for more information of the layout string convention.
|
|
|
|
Parameters
|
|
----------
|
|
data : tvm.te.Tensor
|
|
n-D with shape of layout
|
|
|
|
kernel : list/tuple of three ints
|
|
Kernel size, [kernel_depth, kernel_height, kernel_width]
|
|
|
|
stride : list/tuple of three ints
|
|
Stride size, [stride_depth, stride_height, stride_width]
|
|
|
|
dilation: list/tuple of two ints
|
|
Dilation size, [dilation_height, dilation_width]
|
|
|
|
padding : list/tuple of six ints
|
|
Pad size, [pad_front, pad_top, pad_left, pad_back, pad_bottom, pad_right]
|
|
|
|
pool_type : str
|
|
Pool type, 'max' or 'avg'
|
|
|
|
ceil_mode : bool
|
|
Whether to use ceil when calculating output size.
|
|
|
|
layout: string
|
|
Layout of the input data.
|
|
The layout is supposed to be composed of upper cases, lower cases and numbers,
|
|
where upper case indicates a dimension and
|
|
the corresponding lower case with factor size indicates the split dimension.
|
|
For example, NCDHW16c can describe a 6-D tensor of
|
|
[batch_size, channel, depth, height, width, channel_block],
|
|
in which channel_block=16 is a split of dimension channel.
|
|
|
|
count_include_pad: bool
|
|
Whether include padding in the calculation when pool_type is 'avg'
|
|
|
|
Returns
|
|
-------
|
|
output : tvm.te.Tensor
|
|
n-D in the same layout
|
|
"""
|
|
return cpp.nn.pool3d(
|
|
data,
|
|
kernel,
|
|
stride,
|
|
dilation,
|
|
padding,
|
|
POOL_TYPE_CODE[pool_type],
|
|
ceil_mode,
|
|
layout,
|
|
count_include_pad,
|
|
)
|