0.摘要
提出了两个比较新颖(当时)的模块:用1x1卷积来模拟mlp con(多层感知机卷积层),也可以说是用mlp来代替relu等激活函数;全局均值池化
1.MLP Convolution Layers
Mlpconv层可以看成是每个卷积的局部感受野中还包含了一个微型的多层网络(1x1卷积)。其实在以前的卷积层中,我们局部感受野窗口(做NxN卷积运算)的运算,可以理解为一个广义的线性运算,
GLM(generalized linear model)如下图所示:
但是现在为了提高网络的非线性,就不用普通的卷积,而是用mlp来进行处理
2.Global Average Pooling
本文提出采用全局均值池化的方法,替代传统CNN中的全连接层。与传统的全连接层不同,我们对每个特征图一整张图片进行全局均值池化,这样每张特征图都可以得到一个输出。这样采用均值池化,连参数都省了,可以大大减小网络,避免过拟合,另一方面它有一个特点,每张特征图相当于一个输出特征,然后这个特征就表示了我们输出类的特征。这样如果我们在做10个分类任务的时候,我们网络在设计的时候,最后一层的特征图个数就要选择10。有一点注意力机制那种味道,提取的是通道注意力,不过这里把注意力当作了是各个class的预测值
3.网络结构
NiN是在AlexNet问世不久后提出的。它们的卷积层设定有类似之处。NiN使用卷积窗口形状分别为11×1111×11、5×55×5和3×33×3的卷积层,相应的输出通道数也与AlexNet中的一致。每个NiN块后接一个步幅为2、窗口形状为3×33×3的最大池化层。那么可以根据vgg那种用很多小窗口卷积来代替NIN中的大窗口卷积
NiN去掉了AlexNet最后的3个全连接层,取而代之地,NiN使用了输出通道数等于标签类别数的NiN块,然后使用全局平均池化层对每个通道中所有元素求平均并直接用于分类。这里的全局平均池化层即窗口形状等于输入空间维形状的平均池化层。NiN的这个设计的好处是可以显著减小模型参数尺寸,从而缓解过拟合。然而,该设计有时会造成获得有效模型的训练时间的增加。
import torch.nn.functional as F
class GlobalAvgPool2d(nn.Module):
# 全局平均池化层可通过将池化窗口形状设置成输入的高和宽实现
def __init__(self):
super(GlobalAvgPool2d, self).__init__()
def forward(self, x):
return F.avg_pool2d(x, kernel_size=x.size()[2:])
net = nn.Sequential(
nin_block(1, 96, kernel_size=11, stride=4, padding=0),
nn.MaxPool2d(kernel_size=3, stride=2),
nin_block(96, 256, kernel_size=5, stride=1, padding=2),
nn.MaxPool2d(kernel_size=3, stride=2),
nin_block(256, 384, kernel_size=3, stride=1, padding=1),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Dropout(0.5),
# 标签类别数是10
nin_block(384, 10, kernel_size=3, stride=1, padding=1),
GlobalAvgPool2d(),
# 将四维的输出转成二维的输出,其形状为(批量大小, 10)
d2l.FlattenLayer())