一、NiN块
- 卷积层后跟两个全连接层
- 所接的全连接层的本质上时kernel_size=1 stride=1 的卷积层
- 起到全连接层的作用
二、NiN架构
- 无全连接层 nn.Linear
- 交替使用NiN块和步幅为2的最大池化层(使图像长宽减半)
- 逐步减小长宽和增大通道数
- 最后使用全局平均池化层得到输出
- 其输入的通道数是类别数
三、NiN总结
- NiN块使用卷积层+ 两个1 * 1 的卷积层,或者对每个像素增加了非线性
- NiN 使用全局平均池化层来替代VGG和AlexNet的全连接层
- 优点:不容易过拟合和更少的参数个数
四、代码
nin块的构建
def nin_block(in_channels, out_channels, kernel_size, strides, padding):
return nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())
神经网络的构建
net = nn.Sequential(
nin_block(1, 96, kernel_size=11, strides=4, padding=0),
nn.MaxPool2d(3, stride=2),
nin_block(96, 256, kernel_size=5, strides=1, padding=2),
nn.MaxPool2d(3, stride=2),
nin_block(256, 384, kernel_size=3, strides=1, padding=1),
nn.MaxPool2d(3, stride=2),
nn.Dropout(0.5),
# 标签类别数是10
nin_block(384, 10, kernel_size=3, strides=1, padding=1),
nn.AdaptiveAvgPool2d((1, 1)),
# 将四维的输出转成二维的输出,其形状为(批量大小,10)
nn.Flatten())