网络中的网络:NiN
Posted 心之所向521
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络中的网络:NiN相关的知识,希望对你有一定的参考价值。
前面几篇文章介绍的LeNet、AlexNet和VGG在设计上的共同之处是:先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。其中,AlexNet和VGG对LeNet的改进主要在于如 何对这两个模块加宽(增加通道数)和加深。今天我们来介绍网络中的网络(NiN):它提出了另外 一个思路,即串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络。
我们知道卷积层的输入和输出通常是四维数组(样本,通道,高,宽),而全连接层的输入和输出则通常是二维数组(样本,特征)。如果想在全连接层后再接上卷积层,则需要将全连接层的输出变换为 四维。现在我们用一种特殊的卷积1*1卷积层。它可以看成全连接层,其中空间维度(高和宽)上的每个元素相当于样本,通道相当于1*1特征。因此,NiN使用这个特殊的卷积层来替代全连接层,从而使空间信息能够自然传递到后面的层中去。下图对比了NiN同AlexNet和VGG等网络在结构上的主要区别。
上图是AlexNet和VGG的网络结构局部,下面图是NiN的网络结构局部
NiN块是NiN中的基础块。它由一个卷积层加两个充当全连接层的1x1卷积层串联而成。其中第一个卷积层的超参数可以自行设置,而第二和第三个卷积层的超参数一般是固定的。
import time
import torch
from torch import nn, optim
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
def nin_block(in_channels, out_channels, kernel_size, stride, padding): blk = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size, stride, 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())
return blk
总结:
- NiN重复使用由卷积层和代替全连接层的1x1卷积层构成的NiN块来构建深层网络。
2.NiN去除了容易造成过拟合的全连接输出层,而是将其替换成输出通道数等于标签类别数的NiN块 和全局平均池化层。
3.NiN的以上设计思想影响了后面一系列卷积神经网络的设计。
以上是关于网络中的网络:NiN的主要内容,如果未能解决你的问题,请参考以下文章