之——NiN基础
目录
杂谈
NiN(Network in Network)是一种深度卷积神经网络架构,旨在改善传统卷积神经网络的特征提取能力。它由Min Lin、Qiang Chen和Shuicheng Yan于2013年提出,其主要特点如下:
1. 具有微型多层感知机(MLP)结构: NiN的一个显著特点是在卷积层内部引入了微型多层感知机结构,通常称为MLPConv。传统的卷积层使用卷积核与输入特征图之间的点积操作,而MLPConv使用了一个小型的全连接神经网络(MLP)来代替卷积核,从而更好地捕捉特征。
2. 全局平均池化层: 在传统卷积神经网络中,最后的全连接层通常包含大量参数,容易导致过拟合。NiN采用了全局平均池化层来代替全连接层,这意味着它对整个特征图执行平均池化,然后使用softmax分类器进行分类。这大大减少了参数数量,同时提高了网络的泛化性能。
3. 一维卷积: 除了传统的二维卷积,NiN还包括了一维卷积,这在处理文本数据等一维序列数据时非常有用。一维卷积在特征提取和处理时具有更大的灵活性。
4. 瓶颈结构: NiN引入了瓶颈结构,通过组合1x1的卷积层来降低特征图的维度,然后再通过3x3和5x5的卷积层来进行特征提取。这减小了计算复杂度,同时保持了网络的表示能力。
5. 多尺度特征: NiN网络通过并行的多个卷积层,以不同的滑动窗口尺寸捕捉多尺度特征。这有助于识别不同大小的对象和模式。
6. 参数共享: 类似于传统卷积神经网络,NiN网络仍然利用参数共享的优势,减少了模型中需要学习的参数数量。
NiN的主要目标是提高特征提取的效率和性能,同时减少过拟合的风险。通过引入MLPConv和全局平均池化层,它成功地减少了网络的参数数量,提高了泛化性能,使其成为一种有效的深度卷积神经网络架构,尤其适用于计算机视觉任务。它的设计思想也影响了后续深度学习网络的发展。
NiN(Network in Network)之所以被称为"网络中的网络",是因为它在卷积神经网络(CNN)的架构中引入了一种新的层级结构,这种结构可以被视为在网络内部构建了一个更小的网络。这个内部的网络结构称为多层感知机卷积(MLPConv),它用于替代传统的卷积核操作。这里有几个原因解释了为什么NiN被称为"网络中的网络":
MLPConv层内部网络: NiN引入了MLPConv层,其中包括一个小型多层感知机(MLP),用于特征提取。这个MLP层被认为是"网络中的网络",因为它是卷积层内的一个小型网络结构,用于更丰富地捕捉特征。
增强了特征表示: 传统的卷积操作主要是线性的,而MLPConv层引入了非线性的变换,因此更能够学习复杂的特征表示。这类似于在网络内部构建了一个小型的子网络来更好地捕捉局部特征。
提高了网络的表达能力: MLPConv层中的MLP可以通过学习适当的权重和偏差来进行非线性映射,从而增加了网络的表达能力。这有助于提取更具区分性的特征,有利于更好地分类和识别。
减少参数数量: 虽然NiN引入了MLPConv层,但它仍然保持参数共享的特性,从而减少了整个网络的参数数量。这有助于减小过拟合的风险。
总之,NiN被称为"网络中的网络"是因为它在卷积神经网络的结构中引入了内部的小型网络,这个内部网络通过MLPConv层实现,以更好地提取特征和改进网络性能。这种层级结构的引入是NiN的一个关键特点,也是为什么它被如此命名的原因。
NiN现在很少被使用了,但它其中的一些概念和原理之后很多网络都会用到。
正文
1.全连接层的问题
全连接层前越复杂的卷积过程与通道数的扩展产生了更多的参数,第一个全连接层的参数量是最后一个卷积层的输出量×第一个全连接层的输出量,最大的坏处就是,参数结构的复杂化会产生过拟合。
2.NiN架构(1*1卷积、全局平均池化)
NiN将卷积层与全连接层打包成块:
因为1*1的卷积层可以等价为全连接层:
1*1卷积在步幅1不填充情况下类似全连接层,它提出的主要作用是在不用像真正的全连接层一样Flatten,1.可以在不改变特征图大小情况下灵活地做通道数的调整,2.用来不展平情况下模拟全连接层。NiN的就用了2,把一个卷积层扩展为了一个带类似全连接层的块。020、卷积层多输入输出通道-CSDN博客https://blog.csdn.net/weixin_55706338/article/details/133983903?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133983903%22%2C%22source%22%3A%22weixin_55706338%22%7D
由于在NiN基本单元中已经有了1*1这样的类全连接层,所以在最后没有全连接层,最后使用全局平均池化层得到输出,全局池化就是高宽等于特征图输入高宽,把每一个通道的特征图转化为一个数值。
对最后一个NiN块的所有输出通道分别做全局平均池化,在这之前有多少类最后一个NiN块就应该有多少个输出通道,全局平均池化层就有多少个输入通道,每一个通道的全局平均池化就是对该通道的特征图做一个平均得到一个数值,最后所有n类的数值后接上softmax得到最后的n类预测结果。
全局平均池化层是一种池化操作,它对整个特征图进行平均池化,而不是使用固定大小的池化窗口。在传统的池化层中,通常使用固定大小的池化窗口(例如,2x2或3x3)来对特征图进行下采样,减小空间尺寸。而全局平均池化层则不同,它的池化窗口大小等于输入特征图的大小,即对整个特征图进行池化。
具体而言,对于一个输入特征图,全局平均池化层会计算整个特征图上所有元素的平均值,然后用这个平均值来代表整个特征图的信息。这意味着每个特征图上的位置都对池化的结果有贡献,而不像常规池化层那样只考虑局部区域。
全局平均池化的主要优势之一是它可以显著减少参数数量。由于池化窗口的大小等于特征图的大小,所以只需一个池化操作就可以得到整个特征图的池化结果,而无需学习额外的参数。这有助于降低模型的复杂性,并减少过拟合的风险。
此外,全局平均池化的思想是通过保留整个特征图的信息来提供更全局的感受野,从而有助于捕捉全局特征和空间结构,适用于一些图像分类和定位的任务。
NiN砍掉了全连接层,极大减少了参数量,减少了过拟合可能性。
3.实现
1*1卷积用来不展平情况下模拟全连接层。NiN的就用了这个性质把一个卷积层扩展为了一个带类似全连接层的块。
#NIN块
#1*1卷积用来不展平情况下模拟全连接层。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())
NIiN(Network in Network)块中包含两层1x1卷积层的目的是增加非线性表示能力,并扩展网络的表示能力。这是NIN网络的一种关键特点,它的设计旨在更好地捕获和表达特征。以下是解释为什么使用两层1x1卷积层的原因:
增加非线性性: 1x1卷积层在实质上是全连接层,因为它的卷积核大小为1x1,可以看作对每个位置上的特征进行线性组合。但在1x1卷积层之后添加ReLU激活函数,可以引入非线性性。这两层1x1卷积层的组合提供了更丰富的非线性表示,这对于更复杂的特征建模是有益的。
维度变换: 第一层1x1卷积层将输入通道的维度从
in_channels
转换为out_channels
,而第二层1x1卷积层将其维度保持不变。这允许网络学习不同通道之间的权重和特征组合,从而增加了网络的表示能力。这对于不同通道之间的特征交互和特征选择非常有用。参数少: 1x1卷积层具有较少的参数数量,因为它们的卷积核大小很小。这有助于控制网络的参数数量,减少过拟合的风险,同时提高网络的计算效率。
特征压缩: 1x1卷积层还可以用来减小特征图的通道数,以进行特征压缩。这有助于减小模型的计算开销,并在保留重要信息的同时减小冗余信息。
总之,两层1x1卷积层的组合在NIN块中可用于增加非线性表示能力、提供特征交互、参数数量控制以及特征压缩。这种设计有助于网络更好地捕获和表达特征,提高了其性能、非线性表达能力和泛化能力。
在每个块标注了输入输出图片的大小,用一个图跑一下结构:
net = nn.Sequential(
#224 in , 1 padding → 226 for 11 kernel 4 stride → (224-11+1)/4= 54out
nin_block(1, 96, kernel_size=11, strides=4, padding=1),
#54 in → 54 for 3 kernel 2 stride →(54-3+1)/2=26out
nn.MaxPool2d(3, stride=2),
#26 in , 2 padding → 30 for 5 kernel 1 stride → (30-5+1)/1= 26out
nin_block(96, 256, kernel_size=5, strides=1, padding=2),
#26 in → 26 for 3 kernel 2 stride →(26-3+1)/2=12out
nn.MaxPool2d(3, stride=2),
#12 in, 1 padding → 14 for 3 kernel 1 stride → (14-3+1)/1= 12out
nin_block(256, 384, kernel_size=3, strides=1, padding=1),
#12 in → 12 for 3 kernel 2 stride →(12-3+1)/2=5out
nn.MaxPool2d(3, stride=2),
nn.Dropout(0.5),
# 标签类别数是10 , 5 in ,1 padding → 7 for 3 kernel 1 stride → (7-3+1)=5out
nin_block(384, 10, kernel_size=3, strides=1, padding=1),
#上面输出10个类别通道,下面对每个通道全局平均池化得到输出预测数值
nn.AdaptiveAvgPool2d((1, 1)),
# 将四维的输出转成二维的输出,其形状为(批量大小,10)
nn.Flatten())
X = torch.rand(size=(1, 1, 224, 224))
for layer in net:
X = layer(X)
print(layer.__class__.__name__,'output shape:\t', X.shape)
模型训练,注意Adam一般比SGD的lr小两个数量级:
lr, num_epochs, batch_size = 0.001, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
回过头再去看看Alexnet:023、经典神经网络-Alex
可见新结构的卷积层数量多,使得GPU需求更高,小破脑看不出差别,GUP越好对卷积越友好。
小结
-
NiN使用由一个卷积层和多个1×1卷积层组成的块。该块可以在卷积神经网络中使用,以允许更多的每像素非线性。
-
NiN去除了容易造成过拟合的全连接层,将它们替换为全局平均汇聚层(即在所有位置上进行求和)。该汇聚层通道数量为所需的输出数量(例如,Fashion-MNIST的输出为10)。
-
移除全连接层可减少过拟合,同时显著减少NiN的参数。
-
NiN的设计影响了许多后续卷积神经网络的设计。
-
隐藏层全连接层的宽度使得其很容易过拟合,宽度代表了一层的数据表征能力,但是宽的同时会引入维度这一干扰因素使得模型学习中会过分依赖架构与超参数,容易引起过拟合。
-
模型GPU的内存主要是模型本身+参数+梯度+batch。
-
torch的交叉熵损失函数里自带softmax。