双线性池化的一般计算方法和代码里有很大的不同。
- 按通道(将通道)和按位置(就是把HW中与图片的位置一一对应)
- 按通道
# 这是代码计算的方法
X = X.view(N, 512, 28**2)
X = torch.bmm(X, torch.transpose(X, 1, 2)) / (28**2) # Bilinear
# 假设有512个通道,计算结果等于512*512。那么结果中的第(ij)个就是第i,通道对应相乘然后取平均值。
- 按位置
# 按位置,先求当前位置的`点成`结果,然后
x=torch.from_numpy(np.arange(28*28*512).reshape(1,512,28*28))
bi=[torch.mm(i.reshape(512,1),i.reshape(1,512)) for i in x[0].T]
for i,v in enumerate(bi):
if i==0:
vv=v
else:
vv+=v
-
还真的是一样的诶
- 通道:结果里的第ij,就是通道i和通道j的乘机在求平均值
- 位置:只不过是先(Xhw[i]*Xhw[j]) 从11,加到hw,正好等于上式的值。