关于avg-pooling 是exclusive还是inclusive
Created by: tensor-tang
这里只考虑avg-pooling。
- 根据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.
- 另外一个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打印出来的。