动手学深度学习(pytorch)学习记录29-网络中的网络(NiN)[学习记录] ...

打印 上一主题 下一主题

主题 1782|帖子 1782|积分 5348

介绍

网络中的网络(Network in Network,简称NiN)是一种经典的卷积神经网络结构,由Min Lin等人在2013年提出。NiN的核心头脑是在传统的卷积神经网络中引入小型的多层感知机(MLP),以加强网络的特征提取能力。
NiN的主要特点包括:


  • MLP卷积层(MLP Convolution Layers):NiN通过在卷积层之间加入小型的MLP网络来提取更抽象的特征。这些MLP网络实际上是1x1卷积层,它们可以在保持空间结构的同时,对每个像素位置的通道进行全连接操纵。
  • 全局平均池化层(Global Average Pooling):NiN去除了轻易造成过拟合的全连接层,而是使用全局平均池化层来镌汰模型参数的数目。这种池化层在所有位置上进行求和,输出固定数目的特征,直接用于分类。
  • NiN块(NiN Blocks):NiN的基本构建单位是NiN块,它由一个普通卷积层和两个1x1卷积层组成。普通卷积层负责提取空间特征,而1x1卷积层则充当逐像素的全连接层,加强了特征的非线性表达能力。
  • 镌汰参数数目:由于使用了全局平均池化层和1x1卷积层替代传统的全连接层,NiN显著镌汰了模型的参数数目,有助于缓解过拟合标题。
  • 提高泛化能力:NiN的设计有助于提高模型的泛化能力,因为它通过MLP卷积层和全局平均池化层捕获到了更丰富的特征表现。
NiN的这些设计影响了后续许多卷积神经网络的结构,尤其是在特征提取和分类器设计方面。尽管NiN是一个相对较老的模型,但它的设计理念仍然对深度学习领域产生了深远的影响。
LeNet、AlexNet和VGG都有相同的设计模式:用一系列的卷积层和汇聚层来提取空间结构特征,然后通过全连接层对特征的表征进行处理。
NiN网络使用的NiN块通过在卷积层之间加入雷同于全连接层的1x1卷积层(也称为mlpconv层),加强了网络的非线性特征提取能力。这种设计允许网络在保持空间结构信息的同时,增加了网络的深度和复杂度。
NiN块

以一个普通的卷积层开始,后接两个1×1卷积层(充当带有ReLU激活函数的逐像素全连接层)
  1. import torch
  2. from torch import nn
  3. from d2l import torch as d2l
  4. def nin_block(in_channels, out_channels, kernel_size, strides, padding):
  5.     return nn.Sequential(
  6.         nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
  7.         nn.ReLU(),
  8.         nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU(),
  9.         nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())
复制代码
NiN模型

NiN完全取消了全连接层,而是使用一个NiN块,输出通道数等于标签类别数
  1. net = nn.Sequential(
  2.     nin_block(1, 96, kernel_size=11, strides=4, padding=0),
  3.     nn.MaxPool2d(3, stride=2),
  4.     nin_block(96, 256, kernel_size=5, strides=1, padding=2),
  5.     nn.MaxPool2d(3, stride=2),
  6.     nin_block(256, 384, kernel_size=3, strides=1, padding=1),
  7.     nn.MaxPool2d(3, stride=2),
  8.     nn.Dropout(0.5),
  9.     # 标签类别数是10
  10.     nin_block(384, 10, kernel_size=3, strides=1, padding=1),
  11.     nn.AdaptiveAvgPool2d((1, 1)),
  12.     # 将四维的输出转成二维的输出,其形状为(批量大小,10)
  13.     nn.Flatten())
复制代码
创建一个数据样本来查看每个块的输出形状。
  1. X = torch.rand(size=(1, 1, 224, 224))
  2. for layer in net:
  3.     X = layer(X)
  4.     print(layer.__class__.__name__,'output shape:\t', X.shape)
复制代码
  1. Sequential output shape:         torch.Size([1, 96, 54, 54])
  2. MaxPool2d output shape:         torch.Size([1, 96, 26, 26])
  3. Sequential output shape:         torch.Size([1, 256, 26, 26])
  4. MaxPool2d output shape:         torch.Size([1, 256, 12, 12])
  5. Sequential output shape:         torch.Size([1, 384, 12, 12])
  6. MaxPool2d output shape:         torch.Size([1, 384, 5, 5])
  7. Dropout output shape:         torch.Size([1, 384, 5, 5])
  8. Sequential output shape:         torch.Size([1, 10, 5, 5])
  9. AdaptiveAvgPool2d output shape:         torch.Size([1, 10, 1, 1])
  10. Flatten output shape:         torch.Size([1, 10])
复制代码
训练模型

  1. lr, num_epochs, batch_size = 0.05, 30, 128
  2. train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
  3. d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
复制代码
  1. loss 0.222, train acc 0.919, test acc 0.903
  2. 1686.5 examples/sec on cuda:0
复制代码

· 本文使用了d2l包,这极大地镌汰了代码编辑量,需要安装d2l包才气运行本文代码
封面图片泉源
接待点击我的主页查看更多文章。
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表