LeNet、AlexNet和VGG在设计上的共同之处是:先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。其中,AlexNet和VGG对LeNet的改进主要在于如何对这两个模块加宽(增加通道数)和加深。本节我们介绍网络中的网络(NiN)。它提出了另外一个思路,即串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络

import time
import torch
from torch import nn, optimimport 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

2.NiN模型
NiN是在AlexNet问世不久后提出的。它们的卷积层设定有类似之处。NiN使用卷积窗口形状分别为11 × 11 11\times 1111×11、5 × 5 5\times 55×5和3 × 3 3\times 33×3的卷积层,相应的输出通道数也与AlexNet中的一致。每个NiN块后接一个步幅为2、窗口形状为3 × 3 3\times 33×3的最大池化层。

除使用NiN块以外,NiN还有一个设计与AlexNet显著不同:NiN去掉了AlexNet最后的3个全连接层,取而代之地,NiN使用了输出通道数等于标签类别数的NiN块,然后使用全局平均池化层对每个通道中所有元素求平均并直接用于分类。这里的全局平均池化层即窗口形状等于输入空间维形状的平均池化层。NiN的这个设计的好处是可以显著减小模型参数尺寸,从而缓解过拟合。然而,该设计有时会造成获得有效模型的训练时间的增加。

# 已保存在d2lzh_pytorch
import torch.nn.functional as F
class GlobalAvgPool2d(nn.Module):# 全局平均池化层可通过将池化窗口形状设置成输入的高和宽实现def __init__(self):super(GlobalAvgPool2d, self).__init__()def forward(self, x):return F.avg_pool2d(x, kernel_size=x.size()[2:])net = nn.Sequential(nin_block(1, 96, kernel_size=11, stride=4, padding=0),nn.MaxPool2d(kernel_size=3, stride=2),nin_block(96, 256, kernel_size=5, stride=1, padding=2),nn.MaxPool2d(kernel_size=3, stride=2),nin_block(256, 384, kernel_size=3, stride=1, padding=1),nn.MaxPool2d(kernel_size=3, stride=2), nn.Dropout(0.5),# 标签类别数是10nin_block(384, 10, kernel_size=3, stride=1, padding=1),GlobalAvgPool2d(), # 将四维的输出转成二维的输出,其形状为(批量大小, 10)d2l.FlattenLayer())

我们构建一个数据样本来查看每一层的输出形状

X = torch.rand(1, 1, 224, 224)
for name, blk in net.named_children(): X = blk(X)print(name, 'output shape: ', X.shape)

输出:

0 output shape:  torch.Size([1, 96, 54, 54])
1 output shape:  torch.Size([1, 96, 26, 26])
2 output shape:  torch.Size([1, 256, 26, 26])
3 output shape:  torch.Size([1, 256, 12, 12])
4 output shape:  torch.Size([1, 384, 12, 12])
5 output shape:  torch.Size([1, 384, 5, 5])
6 output shape:  torch.Size([1, 384, 5, 5])
7 output shape:  torch.Size([1, 10, 5, 5])
8 output shape:  torch.Size([1, 10, 1, 1])
9 output shape:  torch.Size([1, 10])

5.8.3 获取数据和训练模型

我们依然使用Fashion-MNIST数据集来训练模型。NiN的训练与AlexNet和VGG的类似,但这里使用的学习率更大。

batch_size = 128
# 如出现“out of memory”的报错信息,可减小batch_size或resize
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)lr, num_epochs = 0.002, 5
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)

输出:

training on  cuda
epoch 1, loss 0.0101, train acc 0.513, test acc 0.734, time 260.9 sec
epoch 2, loss 0.0050, train acc 0.763, test acc 0.754, time 175.1 sec
epoch 3, loss 0.0041, train acc 0.808, test acc 0.826, time 151.0 sec
epoch 4, loss 0.0037, train acc 0.828, test acc 0.827, time 151.0 sec
epoch 5, loss 0.0034, train acc 0.839, test acc 0.831, time 151.0 sec

小结
NiN重复使用由卷积层和代替全连接层的1 × 1 1\times 11×1卷积层构成的NiN块来构建深层网络。
NiN去除了容易造成过拟合的全连接输出层,而是将其替换成输出通道数等于标签类别数的NiN块和全局平均池化层。
NiN的以上设计思想影响了后面一系列卷积神经网络的设计。

pytorch之NIN相关推荐

  1. Pytorch 基于NiN的服饰识别(使用Fashion-MNIST数据集)

    ✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程.

  2. Network in Network(NIN)网络结构详解,网络搭建

    一.简介 Network in Network,描述了一种新型卷积神经网络结构. LeNet,AlexNet,VGG都秉承一种设计思路:先用卷积层构成的模块提取空间特征,再用全连接层模块来输出分类结果 ...

  3. NIN论文翻译及解读

    文章目录 1.MLPCONV结构 2.Global Average Pooling(GAP) 3.NIN网络结构 NIN论文解读及个人理解 NIN网络的代码实现(pytorch) 1.NIN块实现 2 ...

  4. CNN网络模型大总结【持续更新中...】

    本文将总结从LeNet5开始到现在,具有代表性或具有创新意义的CNN网络模型架构.本文特点是, 一.总结内容精简,适于想快速了解网络整体体系结构的人进行阅读: 二.附带有相关网络图,来源于论文或网络, ...

  5. 2022.11.13 学习周报

    文章目录 摘要 文献阅读 1.题目 2.摘要 3.网络结构 3.1 网络示意图 3.2 网络特点 4.Network in Network 4.1 MLP卷积层 4.2 全局平均池化GAP 5.实验 ...

  6. 基于Pytorch再次解读NiN现代卷积神经网络和批量归一化

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  7. Pytorch之CNN:基于Pytorch框架实现经典卷积神经网络的算法(LeNet、AlexNet、VGG、NIN、GoogleNet、ResNet)——从代码认知CNN经典架构

    Pytorch之CNN:基于Pytorch框架实现经典卷积神经网络的算法(LeNet.AlexNet.VGG.NIN.GoogleNet.ResNet)--从代码认知CNN经典架构 目录 CNN经典算 ...

  8. 动手学深度学习(PyTorch实现)(十)--NiN模型

    NiN模型 1. NiN模型介绍 1.1 NiN模型结构 1.2 NiN结构与VGG结构的对比 2. PyTorch实现 2.1 导入相应的包 2.2 定义NiN block 2.3 全局最大池化层 ...

  9. 【动手学深度学习PyTorch版】19 网络中的网络 NiN

    上一篇请移步[动手学深度学习PyTorch版]18 使用块的网络 VGG_水w的博客-CSDN博客 目录 一.网络中的网络 NiN 1.1 NiN ◼ 全连接层的问题 ◼ 大量的参数会带来很多问题 ◼ ...

最新文章

  1. 【C language】C语言二分法查找
  2. linux下如何修改weblogic console登陆的用户名和密码
  3. 用计算机连接路由器,用路由器怎么连接两台电脑
  4. log4j 程序日志_Log4j错误–减慢您的应用程序
  5. symbian 中自动寻找cmwap连接点,通杀uiq 2nd 3nd和s60 2nd 3nd 5nd
  6. CentOS7执行yum命令出错
  7. minion java上传文件_Java程序员如何快速理解Kubernetes
  8. c语言利用天气api,天气预报API_01
  9. 文件查找命令 - find
  10. jpg和tif转pdf遇到的问题和解决方法
  11. SIPP对接fs压力测试
  12. 云计算机是什么技术,什么是云计算技术?
  13. Python—定义与调用函数
  14. cogs2398 切糕 最小割
  15. 计算机视觉 — BOF图像检索
  16. 蛮力法查找有序数列c语言,算法——蛮力法之选择排序和冒泡排序c++实现
  17. ps 动画gif制作
  18. 什么时候应该在ECMAScript 6中使用Arrow函数?
  19. keras+ ctpn 原理流程图
  20. 互联网 vs 区块链革命:早期成功的产品

热门文章

  1. 【知识兔Excel教程】学会这 7 个Excel快捷键,提前半小时下班
  2. SnailOS0.03是很傻很天真!
  3. 高通gobi系列modem
  4. SAP项目实施的5个阶段
  5. 【插件】谷歌浏览器插件 visio在线打开vsdx文件 .vsdx文件在线查看
  6. php网站 qq登陆,PHP QQ一键登入网站实现过程
  7. 这才是简单快速入门Python的正确姿势!
  8. Android Studio基本UI界面设计
  9. 毕业设计外卖点餐系统,外卖点餐系统毕业设计开发需求分析,订餐外卖点餐系统毕业设计分析数据库设计
  10. filewriter追加_JAVA中使用FileWriter追加文见内容