Pytorch自适应平均池化工作原理(AdaptiveAvgPool2d无法导出ONNX,寻找替换方法)-CSDN博客
上一篇因为数据采用的是0-40升序排序的数据,导致下采样有错误的地方,被Sweetwater_zar发现,刚开始看到“输出维度小于输入维度”没看懂,因为维度始终都是4维,他的意思应该是第三第四维的长度;然后就是公式肯定是有的,但是官方并没有给出,所以只能通过数据来推测计算过程
重新生成随机数,再观察结果
import torch
original_shape = (1, 2, 4, 5)
# 0到10之间的浮点数随机张量
x = torch.rand(original_shape) * 10
pool1 = torch.nn.AdaptiveAvgPool2d(3)
pool2 = torch.nn.AdaptiveAvgPool2d(6)
y1 = pool1(x)
y2 = pool2(x)
print(x)
print(y1)
print(y2)
x:
tensor([[[[ 6., 10., 5., 2., 8.],
[ 9., 7., 0., 8., 0.],
[ 6., 4., 8., 4., 6.],
[ 2., 5., 5., 9., 0.]],
[[ 4., 7., 6., 5., 2.],
[ 6., 6., 2., 10., 3.],
[ 7., 7., 9., 7., 8.],
[ 0., 9., 0., 2., 3.]]]])
y1:
tensor([[[[8.0000, 5.3333, 4.5000],
[6.5000, 5.1667, 4.5000],
[4.2500, 5.8333, 4.7500]],
[[5.7500, 6.0000, 5.0000],
[6.5000, 6.8333, 7.0000],
[5.7500, 5.6667, 5.0000]]]])
第一行:
8.0000, 5.3333, 4.5000
8.0=(6+10+9+7)/4
5.3=(10+5+2+7+0+8)/6
4.5=(2+8+8+0)/4
第一列:
8.0000,
6.5000,
4.2500,
8.0=(6+10+9+7)/4
6.5=(9+7+6+4)/4
4.25=(6+4+2+5)/4
改成随机数后可见:
在行方向5列中kernel.w=2,stride.w=2,但中间多出一列kernel.w=3
在列方向4行中kernel.h=2,stride.h=1,刚好采集3个数据
中间的一列卷积核尺寸是3*2
y2:
tensor([[[[6.0000, 8.0000, 7.5000, 3.5000, 5.0000, 8.0000],
[7.5000, 8.0000, 5.5000, 3.7500, 4.5000, 4.0000],
[9.0000, 8.0000, 3.5000, 4.0000, 4.0000, 0.0000],
[6.0000, 5.0000, 6.0000, 6.0000, 5.0000, 6.0000],
[4.0000, 4.2500, 5.5000, 6.5000, 4.7500, 3.0000],
[2.0000, 3.5000, 5.0000, 7.0000, 4.5000, 0.0000]],
[[4.0000, 5.5000, 6.5000, 5.5000, 3.5000, 2.0000],
[5.0000, 5.7500, 5.2500, 5.7500, 5.0000, 2.5000],
[6.0000, 6.0000, 4.0000, 6.0000, 6.5000, 3.0000],
[7.0000, 7.0000, 8.0000, 8.0000, 7.5000, 8.0000],
[3.5000, 5.7500, 6.2500, 4.5000, 5.0000, 5.5000],
[0.0000, 4.5000, 4.5000, 1.0000, 2.5000, 3.0000]]]])
第一行:
6.0000, 8.0000, 7.5000, 3.5000, 5.0000, 8.0000
6.0=6.0
8.0=(6+10)/2
7.5=(10+5)/2
3.5=(5+2)/2
5.0=(2+8)/2
8.0=8
第一列:
6.0000,
7.5000,
9.0000,
6.0000,
4.0000,
2.0000,
6.0=6.0
7.5=(6+9)/2
9.0=9.0
6.0=6.0
4.0=(6+2)/2
2.0=2.0
改成随机数后可见:
向上采样时和之前是一样的