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

embedded/2024/9/24 13:19:02/

目录

  • 介绍
  • NiN块
  • NiN模型
  • 训练模型

介绍

网络中的网络(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激活函数的逐像素全连接层)

import torch
from torch import nn
from d2l import torch as d2ldef 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())

NiN模型

NiN完全取消了全连接层,而是使用一个NiN块,输出通道数等于标签类别数

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),# 标签类别数是10nin_block(384, 10, kernel_size=3, strides=1, padding=1),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)
Sequential output shape:	 torch.Size([1, 96, 54, 54])
MaxPool2d output shape:	 torch.Size([1, 96, 26, 26])
Sequential output shape:	 torch.Size([1, 256, 26, 26])
MaxPool2d output shape:	 torch.Size([1, 256, 12, 12])
Sequential output shape:	 torch.Size([1, 384, 12, 12])
MaxPool2d output shape:	 torch.Size([1, 384, 5, 5])
Dropout output shape:	 torch.Size([1, 384, 5, 5])
Sequential output shape:	 torch.Size([1, 10, 5, 5])
AdaptiveAvgPool2d output shape:	 torch.Size([1, 10, 1, 1])
Flatten output shape:	 torch.Size([1, 10])

训练模型

lr, num_epochs, batch_size = 0.05, 30, 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())
loss 0.222, train acc 0.919, test acc 0.903
1686.5 examples/sec on cuda:0

在这里插入图片描述

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


http://www.ppmy.cn/embedded/110894.html

相关文章

6、多线程

一、线程创建方法 1、继承Thread类 自定义线程类,继承(extends)Thread 重写run()方法 创建线程对象,调用start()方法启动线程 MyThread thread1 new MyThread(); thread1.start();2、实现Runnable类(常用,因为接口可以多继承&…

【Python】03.Python 的语句

一、顺序语句 默认情况下, Python 的代码执行顺序是按照从上到下的顺序依次执行的 二、条件语句 2.1 条件语句的概念 条件语句 也叫做 分支语句, 表示了接下来的逻辑可能有几种走向 2.2 条件语句的语法 Python 中使用 if else 关键字表示条件语句 2.2.1 if if expressi…

财富通公司开发洗车小程序有哪些用处?

洗车小程序具有多种用处,主要体现在以下几个方面: 1.便捷预约服务:用户可以通过洗车小程序轻松预约洗车服务,无需亲自前往洗车店或打电话预约,节省了时间和精力。同时,小程序通常提供多种预约时间选项&…

三大.NET全文搜索框架比较:Lucene.NET, Elasticsearch, Solr 实战与性能分析

Lucene.NET、Elasticsearch for .NET 和 Solr for .NET 是 .NET 开发中使用的三个重要的全文搜索解决方案。以下是它们的优势和缺点的分析以及一些C#示例代码,帮助你在项目中披荆斩棘。 1. Lucene.NET 优势: 轻量级:Lucene.NET 是一个轻量…

【2025】基于 SpringBoot 的电影购票系统、电影购票系统、智能电影购票系统、电影购票平台、电影购票管理、微服务电影购票系统(源码+文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

LabVIEW开发FPGA方法与FIFO数据丢失处理

开发基于NI 7975R FPGA的系统涉及一系列流程,包括驱动安装、LabVIEW项目设置、开发调试、编译和与Windows系统的通信。重点在于FIFO的正确配置,避免数据丢失是关键环节之一,尤其是在使用高速数据流传输时。以下将详细介绍这些过程&#xff0c…

利用 Vue.js 自定义指令实现权限控制:问题解析与最佳实践20240912

利用 Vue.js 自定义指令实现权限控制:问题解析与最佳实践 引言 在现代前端开发中,权限控制是一个常见且重要的功能。无论是在企业级应用还是个人项目中,确保用户只能访问他们有权查看或操作的内容是至关重要的。在 Vue.js 中,我…

C++单例模式

在C中,单例模式是一种确保一个类只有一个实例,并提供一个全局访问点来访问这个实例的设计模式。 单例模式中的饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)是两种不同的实例化策略&#xf…