Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Maxpool spec update #3758

Merged
merged 30 commits into from
Feb 5, 2021
Merged
Changes from 22 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
73ebf8f
Update spec
pszmel Dec 28, 2020
3cf4ac6
Update outputs section
pszmel Dec 28, 2020
b1ddfad
Update rounding_type section
pszmel Dec 28, 2020
9d221e2
Update spec
pszmel Dec 29, 2020
bf1c7dc
Update input section
pszmel Dec 29, 2020
8665800
add newline
pszmel Dec 29, 2020
6af32dd
fix one xml example
pszmel Dec 29, 2020
46584be
fix indentation
pszmel Dec 29, 2020
f7112d4
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Dec 29, 2020
f176a7e
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Jan 7, 2021
d5e9a81
Update detailed description
pszmel Jan 13, 2021
1620158
Update detailed description
pszmel Jan 13, 2021
66cef4d
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Jan 14, 2021
1a0fd09
Update spec
pszmel Jan 14, 2021
8a43aa3
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Jan 14, 2021
48f3cce
Change reference name
pszmel Jan 14, 2021
27faead
add new line
pszmel Jan 14, 2021
82989f1
Update spec
pszmel Jan 18, 2021
c9dd292
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Jan 18, 2021
ed37055
fix typo
pszmel Jan 18, 2021
fa3e0ca
fix style
pszmel Jan 18, 2021
46142dd
fix example 5 description
pszmel Jan 18, 2021
9191e2e
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Jan 31, 2021
22bffc9
Update spec
pszmel Feb 1, 2021
e7ac30d
Add Types section
pszmel Feb 1, 2021
15a3045
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Feb 1, 2021
e7b64d9
Refactor xml examples
pszmel Feb 2, 2021
b1e8213
Merge remote-tracking branch 'upstream/master' into maxpool_spec_update
pszmel Feb 2, 2021
055a28d
Update xml examples and add bfloat16 to supported types
pszmel Feb 4, 2021
f8a0810
Update supported types
pszmel Feb 4, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 177 additions & 13 deletions docs/ops/pooling/MaxPool_1.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

**Category**: *Pooling*

**Short description**: [Reference](http://caffe.berkeleyvision.org/tutorial/layers/pooling.html)
**Short description**: Performs max pooling operation on input.

**Detailed description**: [Reference](http://cs231n.github.io/convolutional-networks/#pool)
**Detailed description**: Input shape can be either 3D, 4D or 5D. Max Pooling operation is performed with the respect to input shape from the third dimension to the last dimension. If paddings are used then during the pooling calculation their value is `-inf`. [Article about max pooling in Convolutional Networks](https://deeplizard.com/learn/video/ZjM_XQa5s6s).
pszmel marked this conversation as resolved.
Show resolved Hide resolved
pszmel marked this conversation as resolved.
Show resolved Hide resolved

**Attributes**: *Pooling* attributes are specified in the `data` node, which is a child of the layer node.

Expand Down Expand Up @@ -46,7 +46,7 @@

* *rounding_type*

* **Description**: *rounding_type* is a type of rounding to be applied.
* **Description**: *rounding_type* is a type of rounding to be used to compute output shape.
* **Range of values**:
* *ceil*
* *floor*
Expand All @@ -63,24 +63,188 @@
* **Type**: string
* **Default value**: *explicit*
* **Required**: *no*
* **Note**: *pads_begin* and *pads_end* attributes are ignored when *auto_pad* is specified.
* **Note**: *pads_begin* and *pads_end* attributes are ignored when *auto_pad* is not equal to explicit.

pszmel marked this conversation as resolved.
Show resolved Hide resolved
**Inputs**:

* **1**: 4D or 5D input tensor. Required.
* **1**: 3D, 4D or 5D input tensor. Required.

**Outputs**:
* **1**: Input shape can be either [N,C,H], [N,C,H,W] or [N,C,H,W,D]. Then the corresponding output shape will be [N,C,H_out], [N,C,H_out,W_out] or [N,C,H_out,W_out,D_out]
pszmel marked this conversation as resolved.
Show resolved Hide resolved

**Mathematical Formulation**
Output shape calculation based on `auto_pad` and `rounding_type`:
pszmel marked this conversation as resolved.
Show resolved Hide resolved
* `auto_pad = explicit` and `rounding_type = floor`
`H_out = floor(H + pads_begin[0] + pads_end[0] - kernel[0] / strides[0]) + 1`
`W_out = floor(W + pads_begin[1] + pads_end[1] - kernel[1] / strides[1]) + 1`
`D_out = floor(D + pads_begin[2] + pads_end[2] - kernel[2] / strides[2]) + 1`

* `auto_pad = valid` and `rounding_type = floor`
`H_out = floor(H - kernel[0] / strides[0]) + 1`
`W_out = floor(W - kernel[1] / strides[1]) + 1`
`D_out = floor(D - kernel[2] / strides[2]) + 1`

* `auto_pad = same_upper/same_lower` and `rounding_type = floor`
`H_out = H`
`W_out = W`
`D_out = D`

* `auto_pad = explicit` and `rounding_type = ceil`
`H_out = ceil(H + pads_begin[0] + pads_end[0] - kernel[0] / strides[0]) + 1`
`W_out = ceil(W + pads_begin[1] + pads_end[1] - kernel[1] / strides[1]) + 1`
`D_out = ceil(D + pads_begin[2] + pads_end[2] - kernel[2] / strides[2]) + 1`

* `auto_pad = valid` and `rounding_type = ceil`
`H_out = ceil(H - kernel[0] / strides[0]) + 1`
`W_out = ceil(W - kernel[1] / strides[1]) + 1`
`D_out = ceil(D - kernel[2] / strides[2]) + 1`

* `auto_pad = same_upper/same_lower` and `rounding_type = ceil`
`H_out = H`
`W_out = W`
`D_out = D`

If `H + pads_begin[i] + pads_end[i] - kernel[i]` is not divided by `strides[i]` evenly then the result is rounded with the respect to `rounding_type` attribute.

Example 1 shows how *MaxPool* operates with 4D input using 2D kernel and `auto_pad = explicit`

pszmel marked this conversation as resolved.
Show resolved Hide resolved
```
input = [[[[-1, 2, 3],
[4, 5, -6],
[-7, 8, 9]]]]
strides = [1, 1]
pads_begin = [1, 1]
pads_end = [1, 1]
kernel = [2, 2]
rounding_type = "floor"
auto_pad = "explicit"
output = [[[[-1, 2, 3, 3],
[4, 5, 5, -6],
[4, 8, 9, 9],
[-7, 8, 9, 9]]]]
```

Example 2 shows how *MaxPool* operates with 3D input using 1D kernel and `auto_pad = valid`

```
input = [[[-1, 2, 3, 5, -7, 9, 1]]]
strides = [1]
kernel = [3]
rounding_type = "floor"
auto_pad = "valid"
output = [[[3, 5, 5, 9, 9]]]
```

Example 3 shows how *MaxPool* operates with 4D input using 2D kernel and `auto_pad = same_lower`

```
input = [[[[-1, 2, 3],
[4, 5, -6],
[-7, 8, 9]]]]
strides = [1, 1]
kernel = [2, 2]
rounding_type = "floor"
auto_pad = "same_lower"
output = [[[[-1, 2, 3],
[4, 5, 5]
[4, 8, 9]]]]
```

Example 4 shows how *MaxPool* operates with 4D input using 2D kernel and `auto_pad = same_upper`

```
input = [[[[-1, 2, 3],
[4, 5, -6],
[-7, 8, 9]],
[[2, -1, 5],
[6, -7, 1],
[8, 2, -3]]]]
strides = [1, 1]
kernel = [2, 2]
rounding_type = "floor"
auto_pad = "same_upper"
output = [[[[5, 5, -6],
[8, 9, 9]
[8, 9, 9]],
[[6, 5, 5],
[8, 2, 1],
[8, 2, -3]]]]
```

Example 5 shows how *MaxPool* operates with 4D input using 2D kernel, `auto_pad = valid` and `rounding_type = ceil`

```
input = [[[[-1, 2, 3],
[4, 5, -6],
[-7, 8, 9]]]]
strides = [2, 2]
kernel = [2, 2]
rounding_type = "ceil"
auto_pad = "valid"
output = [[[[5, 3],
[8, 9]]]]
```

**Examples**

\f[
output_{j} = max(x_{0}, ..., x_{i})
\f]
```xml
<layer ... type="MaxPool" ... >
pszmel marked this conversation as resolved.
Show resolved Hide resolved
<data auto_pad="same_upper" kernel="2,2" strides="2,2"/>
jdanieck marked this conversation as resolved.
Show resolved Hide resolved
<input>
<port id="0">
<dim>1</dim>
<dim>3</dim>
<dim>32</dim>
<dim>32</dim>
</port>
</input>
<output>
<port id="1">
<dim>1</dim>
<dim>3</dim>
<dim>32</dim>
<dim>32</dim>
</port>
</output>
</layer>

**Example**
<layer ... type="MaxPool" ... >
<data auto_pad="explicit" kernel="2,2" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
<input>
<port id="0">
<dim>1</dim>
<dim>3</dim>
<dim>32</dim>
<dim>32</dim>
</port>
</input>
<output>
<port id="1">
<dim>1</dim>
<dim>3</dim>
<dim>17</dim>
<dim>17</dim>
</port>
</output>
</layer>

```xml
<layer ... type="MaxPool" ... >
<data auto_pad="same_upper" kernel="3,3" pads_begin="0,0" pads_end="1,1" strides="2,2"/>
<input> ... </input>
<output> ... </output>
<data auto_pad="valid" kernel="2,2" strides="2,2"/>
<input>
<port id="0">
<dim>1</dim>
<dim>3</dim>
<dim>32</dim>
<dim>32</dim>
</port>
</input>
<output>
<port id="1">
<dim>1</dim>
<dim>3</dim>
<dim>16</dim>
<dim>16</dim>
</port>
</output>
</layer>
```