Skip to content

关于avg-pooling 是exclusive还是inclusive #4136

@tensor-tang

Description

@tensor-tang

这里只考虑avg-pooling。

  1. 根据Paddle最新code,对于如下pooling设置:
    batchsize: 1
    channel: 1
    input image size: 3
    output image size: 2
    kernel size: 3
    padding size: 1
    stride size: 2
    加上Padding后输入图片的数据为:
0 0 0 0 0
0 0.33958 0.320544 0.173373 0
0 0.050157 0.025043 0.671224 0
0 0.556442 0.787041 0.218098 0
0 0 0 0 0

forward的输出结果为:

0.081703 0.132243
0.157632 0.189045

可以看出来每个数都是除以的9,所以这个结果是属于inclusive的,也就是平均的时候包含了padding的0.

  1. 另外一个case,相比之前的例子把input image size改为4,padding size为0,其他不变
    得到一个输入
0.458402 0.949747 0.165358 0.327871
0.844729 0.449376 0.000869 0.774723
0.326577 0.323052 0.444988 0.277968
0.622502 0.119946 0.636519 0.091483

此时Forward的输出为:

0.440344 0.331963
0.412264 0.36274

显然这个最右下角的结果0.36274,是需要在输入数据的右面和下面加padding才能凑满size 为3的kernel ,也就是说逻辑上的输入是这样的:(假设自动padding 0)

0.458402 0.949747 0.165358 0.327871 0
0.844729 0.449376 0.000869 0.774723 0
0.326577 0.323052 0.444988 0.277968 0
0.622502 0.119946 0.636519 0.091483 0
0 0 0 0 0

如果按照inclusive的逻辑,那个值是这个矩阵的avg:

0.444988 0.277968 0
0.636519 0.091483 0
0 0 0

那么结果应该是1.450958 / 9 = 0.161218, 而显然,paddle的结果并不是这个,而是1.450958 / 4 = 0.36274,这是属于exclusive的pooling。

所以我就有点疑惑了,或者说对于设计者来说,他可能并不能知道这件事情,但是这个对于model的设计应该是重要的。

或者说,我的问题是这里avg pooling的设计是遵从的什么准则,个人觉得不应该是两者的混合。

PS:这些值都是在现在paddle中加log打印出来的。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions