2014年,ICLR的一篇paper——Network in Network。0
小总结:
LeNet、AlexNet和VGG在设计上存在共同之处:先由卷积层conv模块充分抽取空间特征,再由全连接层构成的模块输出分类结果。
并且之前的改进方向为:如何加宽通道数和加深网络深度。
NiN
它提出了一个思路,串联多个由卷积层和“全连接层”构成的小网络来构建一个深层网络。“全连接层”则是1x1的卷积层。
NiN块
NiN块:NiN中的基础块
组成:卷积层 + 2个1x1卷积层串联而成
卷积窗口形状:11x11、5x5、3x3
每个NiN块后接一个步长为2、窗口为3x3的最大池化层
与AlexNet不同之处
- 使用NiN块
- 取消AlexNet中最后的3个全连接层,而是使用输出通道数等于标签类别数的NiN块,并利用全局平均池化层对每个同道中人所有元素求平均并直接用于分类。
这么做的优点:
显著地减小了模型参数尺寸,从而缓解过拟合;有时能获得有效模型的训练时间的增加
NiN网络架构
Sequential(
(0): Sequential(
(0): Conv2d(1, 96, kernel_size=(11, 11), stride=(4, 4))
(1): ReLU()
(2): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1))
(3): ReLU()
(4): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1))
(5): ReLU()
)
(1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(2): Sequential(
(0): Conv2d(96, 256, kernel_size=(11, 11), stride=(1, 1), padding=(2, 2))
(1): ReLU()
(2): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))
(3): ReLU()
(4): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))
(5): ReLU()
)
(3): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(4): Sequential(
(0): Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): Conv2d(384, 384, kernel_size=(1, 1), stride=(1, 1))
(3): ReLU()
(4): Conv2d(384, 384, kernel_size=(1, 1), stride=(1, 1))
(5): ReLU()
)
(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(6): Dropout(p=0.5, inplace=False)
(7): Sequential(
(0): Conv2d(384, 10, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): Conv2d(10, 10, kernel_size=(1, 1), stride=(1, 1))
(3): ReLU()
(4): Conv2d(10, 10, kernel_size=(1, 1), stride=(1, 1))
(5): ReLU()
)
(8): GlobalAvgPool2d()
(9): FlattenLayer()
)
小结
NiN网络主要有两点创新:
- 利用1x1卷积进行加深网络深度
- 取消了全连接层,减小过拟合的可能性,使用NiN块和全局平均池化层取而代之