1 问题

在深度学习的卷积网络过程中,神经网络有卷积层,池化层,全连接层。而池化层有最大值池化和均值池化两种情况,而我们组就在思考,最大值池化和均值池化有什么区别呢?两者的模型准确率是否有所不同?

2 方法

这是所有的代码,主要改变卷积层中的最大值池化和均值池化的相关代码即可。也就是maxpool2d和avgpool2d的应用。

class MyNet(nn.Module):

   # (5.2)定义网络有哪些层,这些层都作为成员变量

 

def __init__(self) -> None:
        super().__init__()
        self.conv1=nn.Conv2d(in_channels=1,out_channels=16,
            kernel_size=3,stride=1,padding=1)
        self.conv2=nn.Conv2d(in_channels=16,out_channels=32,
            kernel_size=3,stride=1,padding=1)
        self.max_pool=nn.MaxPool2d(kernel_size=2,
            stride=2)
        #self.avg_pool=nn.AvgPool2d(kernel_size=2,stride=2)
        self.fc=nn.Linear(in_features=32*14*14,
            out_features=10)
    def forward(self, x):
        x=self.conv1(x)
        x=self.conv2(x)
        x=self.max_pool(x)
        #x=self.avg_pool(x)
        #[B,C,H,W]
        #1的目的是拉伸C,H,W,不拉伸B
        x=torch.flatten(x,1)
        out=self.fc(x)
        return out

pytorch 最大池化和平均池化 最大值池化 均值池化_2d

pytorch 最大池化和平均池化 最大值池化 均值池化_pytorch 最大池化和平均池化_02

pytorch 最大池化和平均池化 最大值池化 均值池化_ide_03

然后我们训练了100个周期,通过比较2者的准确率和损失值来比较分析。

两者分别是均值池化和最大值池化,可以从图中看出,不论是均值池化还是最大值池化,两者的准确率都是前10个周期准确率猛增。而在10个周期之后,均值池化的准确率是基于平稳的,并且train和val的准确率是交错的。最大值池化的准确率还是在继续增长,虽然增长幅度不是太大,并且train和val的准确率是分开的,一直保持没有交错。

均值池化的test准确率为

pytorch 最大池化和平均池化 最大值池化 均值池化_ide_04

最大值池化的test准确率为

pytorch 最大池化和平均池化 最大值池化 均值池化_ide_05

能够看出来,最大值池化的准确率高于均值池化的准确率。

两者分别是均值池化和最大值池化,可以看出两者的loss率其实差别不大,但是最大值池化的loss下降明显先猛烈下降然后再逐渐下降的,均值池化是先猛烈下降然后基于平稳的。

pytorch 最大池化和平均池化 最大值池化 均值池化_2d_06

pytorch 最大池化和平均池化 最大值池化 均值池化_池化_07

3 结语

对于均值池化和最大值池化的比较分析,我们运用了100个周期训练模型然后画图比较准确率和loss,发现最大值池化的准确率高于均值池化的准确率,但是均值池化的准确率在训练周期较少时,准确率较高,而最大值池化的准确率在训练周期较多时,准确率较高,说明这个方法是有效的,但是本次实验并没有对一个方法进行多次训练,较少偶然性,未来我们可以继续研究多次训练之后的模型的预测准确率是否有较大差异,来验证是否具有实验偶然性。