我们知道平均池化的作用就是kernel_size大小的池化窗口在特征图上滑动,池化窗口覆盖到的特征图的值相加后平均作为该覆盖区域的值输出。如果我们用卷积的操作去表示平均池化,卷积的权重可以表示为(假设为二维数据,kernel_size=3):
注意:此时卷积核的权重不再是可训练参数。
代码实现:
# 定义卷积核的权重参数
def define_Conv_to_Avg2d(in_channel,out_channel,kernel_size):
if isinstance (kernel_size,int):
weight=torch.ones((in_channel,out_channel,kernel_size,kernel_size))
xs=kernel_size*kernel_size
weight=weight/xs
elif isinstance (kernel_size,tuple) and len(kernel_size)==2:
weight=torch.ones((in_channel,out_channel,kernel_size[0],kernel_size[1]))
xs=kernel_size[0]*kernel_size[1]
weight=weight/xs
else:
print('kernel_size size error!')
return weight
Pi = nn.Conv3d(in_channel,out_channel,kernel_size=3,stride=2, padding=1, bias=False)
# 因为池化不改变通道大小,所以这里in_channel=out_channel
Pi.weight=torch.nn.Parameter(define_Conv_to_Avg2d(in_channel,out_channel,kernel_size=3),requires_grad=False)