pytorch 用卷积来表示平均池化

我们知道平均池化的作用就是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)

猜你喜欢

转载自blog.csdn.net/qq_44846512/article/details/113655687