NIN(Network In Network)

news2025/1/24 14:56:02

目录

  • 论文信息
  • 摘要
    • 批注
  • 主要工作
    • 1. MLPCONV结构
    • 1.1为什么1×1卷积层可以代替MLP层
    • 1.2 批注
    • 2. Global Average Pooling(GAP)
    • 3、NIN网络结构
    • NIN论文解读及个人理解
    • NIN网络的代码实现(pytorch)
  • 参考文献

论文信息

论文名称:Network In Network
论文地址:https://arxiv.org/pdf/1312.4400.pdf
论文别名:NIN
发表期刊:ICLR(International Conference on Learning Representations)

摘要

在这里插入图片描述
我们提出了一种新式深度网络结构称之为NIN,增强模型对感受野内局部块的辨别力。 传统的卷积层使用线性过滤器后跟非线性激活函数来扫描输入。 与之相反的是我们构建更加复杂结构的微神经网络来使得感受野内的数据抽象化。 我们使用多层感知器来实例化微神经网络,这是一种强大的函数逼近器。 特征图是通过以与 CNN 类似的方式在输入上滑动微网络获得的,然后将特征图送入下一层。 深度 NIN 可以通过堆叠多个上述结构来实现。 通过微网络增强的局部建模,我们能够在分类层的特征图上利用全局平均池化,这比传统的全连接层更容易解释并且更不容易过拟合。同时我们展示了 NIN 在 CIFAR-10 和 CIFAR-100 上的最新分类性能,以及在 SVHN 和 MNIST 数据集上的合理性能。

批注

总感觉本文的作者对多层感知机有一些误解

主要工作

1. MLPCONV结构

NIN中mlpconv结构是将多层感知机MLP和卷积Conv集合在了一起,即传统卷积层Conv后加MLP层,构成NIN块,但在真正代码实现的时候作者用的是1x1的Conv,这点让我感觉很困惑,特意查了一下。
在这里插入图片描述

1.1为什么1×1卷积层可以代替MLP层

MLP层等价于全连接层。

当输入的特征图的尺寸为 n c n_c ncx1x1时,全连接层和1X1的卷积层没有区别。

当输入为c×wxh时,卷积层和全连接层就不一样了,1×1的卷积输出为n×w×h,全连接的输出是n×1×1。此时,全连接可以等价于n个cxwxh卷积核的卷积层。全连接层和卷积层最大的区别就是输入尺寸是否可变,全连接层的输入尺寸是固定的,卷积层的输入尺寸是任意的。

1.2 批注

我到现在都没有明白作者为什么不在论文里写1x1卷积,非要搞出个MLPConv的概念.

2. Global Average Pooling(GAP)

在最后一个mlpconv层中为分类任务的每个对应类别生成一个特征图,通过GAP层取每个特征图的空间平均值,将结果向量直接传入到softmax层。(传统的做法都是在最后一层卷积层得到的特征图后面跟上FC层)

GAP较FC的优点:
①强制特征图和类别之间的对应关系,更适合卷积结构。
②GAP中没有要优化的参数,减少了参数量,避免了过拟合
③GAP汇总了空间信息,对输入的空间转化更加稳定。
④FC输入的大小必须固定,而GAP对网络输入的图像尺寸没有固定要求。
在使用 GAP 时 feature map 数要等于要分类的类别数,然后再对每一个 feature map 求均值,送到softmax中。

3、NIN网络结构

这篇文章中整个NIN网络包括:三个堆叠的mlpconv层和一个全局平均池化(GAP)层,如下图所示:
1、在三个mlpconv层后跟GAP。
2、可以在mlpconv层中间加入下采样层(与CNN和maxout网络一样)。
3、每个mlpconv层都有一个三层感知机。
4、NIN和微网络中的层数可根据特定任务调整。

NIN论文解读及个人理解

在这里插入图片描述
1、本文实际的NIN块(即mlpconv层)等价于普通卷积后跟两个1×1conv(即mlp层),其中每个卷积操作后面都有ReLU进行非线性激活。

2、mlpconv的作用总结:
①相当于在通道间做特征融合。
②相当于每一层卷积之后加一个激活函数,增加了结构的非线性表达能力。

3、可以将与mlp等价的1×1conv+ReLU灵活运用到其他网络中(如GoogLeNet中的InceptionV1模块),后面的网络运用mlpconv时直接将之转化为1×1conv+ReLU。

4、1×1卷积思想:
①可以将1×1卷积看作是全连接层(将通道看成特征维,将宽和高维度上的样本当作是数据样本)
②1×1卷积既可以增加、减少通道数,也可以使通道数量不变化。

5、GAP思想:
① 前面的 mlpconv 层已经能提取出高维的有分类能力的特征了,不需要再多加几层FC层。可以把通道维看做特征维,宽度和长度的维度看做样本。那么 GAP 的本质就是把样本求均值映射到特征,因为最后一层的 feature map 数和类别数相同,那么也就是把样本映射到要分类的类别。

② FC层会综合前面卷积所提取所有的特征,可以把特征理解到更高的维度,来进行判别。也正是因为加上FC层,网络才更容易过拟合,因为FC层的理解力过于强大,它实际上是把所有可能考虑的情况都进行了考虑。怎么进行改进?因为我们前面用 mlpconv 层已经理解到了更高维能够分类的特征,那么最后就可以不用FC层,直接用 GAP 来对每个 feature map 求均值就行,因为模型已经把提取能够分类的特征的任务重心放到了整个模型的前面(mlpconv),后面只用综合前面的结果做出最后的判断就行。

NIN网络的代码实现(pytorch)
NiN块是NiN中的基础块。它由一个卷积层加两个充当全连接层的1×1卷积层(卷积层后跟ReLU)串联而成。其中第一个卷积层的超参数可以自行设置,而第二和第三个卷积层的超参数一般是固定的。

NIN网络的代码实现(pytorch)

NIN 块实现

import torch.nn as nn
import torch.nn.functional as F
class NIN_BLOCK(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride, padding):
        super(NIN_BLOCK, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=1)
        self.conv3 = nn.Conv2d(out_channels, out_channels, kernel_size=1)
    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = self.conv3(x)
        return F.relu(x)

GAP层实现一

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:])  

GAP层实现二

class GlobalAvgPool2d(nn.Module):
	def __init__(self):
        super(GlobalAvgPool2d, self).__init__()
# nn.AdaptiveAvgPool2d(要转化成的大小)
## 如:
# nn.AdaptiveAvgPool2d((6, 6))
## 那么此函数会根据当前来到此处的 feature map 自动求 padding 和 stride,并输出(6,6)大小的 feature map
## 所以,此函数也能用到全卷积中,用来自动调整步长以适应图像不同的输入
		# 全局平均池化,就是如下写法:
		self.GAP = nn.AdaptiveAvgPool2d((1, 1))
	def forward(self, x):
		return self.GAP(x)

NIN 网络实现

class NIN(nn.Module):
    def __init__(self):
        super(NIN, self).__init__()
        self.block1 = NIN_BLOCK(3, 96, kernel_size=11, stride=4, padding=0)
        self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=2)  # 224*224*3 → 55*55*96 由以上两步共同完成
        self.block2 = NIN_BLOCK(96, 256, kernel_size=5, stride=1, padding=2)
        self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=2)  # 55*55*96 → 27*27*256
        self.block3 = NIN_BLOCK(256, 384, kernel_size=3, stride=1, padding=1)
        self.maxpool3 = nn.MaxPool2d(kernel_size=3, stride=2)  # 27*27*256 → 13*13*384
        self.block4 = NIN_BLOCK(384, 1000, kernel_size=3, stride=1, padding=1)
        self.GAP = GlobalAvgPool2d()
    def forward(self, x):
        x = self.block1(x)
        x = self.maxpool1(x)
        x = self.block2(x)
        x = self.maxpool2(x)
        x = self.block3(x)
        x = self.maxpool3(x)
        x = F.dropout(x, 0.5, training=self.training)
        x = self.block3(x)
        x = self.GAP(x)
        x = x.view(x.shape[0], -1)  # 将四维输出转换为二维输出,即形状为(批量大小,1000)
        return F.softmax(x, dim=1)

参考文献

https://www.jianshu.com/p/1690899f869e (对1x1卷积层和全连接层关系的解释)
https://blog.csdn.net/qq_40635082/article/details/123146987(NIN论文解读很到位)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL注入—报错注入

0x00 背景 SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲…

SpringBoot集成WebSocket的两种方式

本站在2014年4月时曾全面的学习HTML5的技术,特写过HTML5的WebSocket示例,当时使用的Servlet3.0规范中的API,需要Tomcat7的支持(貌似在Tomcat6的后期维护版本也增加了WebSocket的支持),早在当初该示例还是本…

SVN注册下载安装以及使用一气呵成

本博客根据SVNbucket官方视频学习制作的,这里记录本人操作的记录 视频链接: https://www.bilibili.com/video/BV1k4411m7mP?vd_sourcea4c65e14d1ff11ea858cadc164fbb59e 一 .SVN的介绍 1.SVN是什么 查阅资料可以知道 ,这是一个开放源代码的版本控制系统,管理着随时间改变的…

docsify项目部署(华为云+宝塔+centos+docker+nginx)踩坑指南

docsify部署(华为云宝塔centosdockernginx) 🗡1、安装docker 首先在服务器中安装docker sudo yum install -y yum-utils由于之前我的python默认版本升级到了python3,但yum执行使用的是python2,就遇到报错 File &quo…

Hbase架构

HBase 系统遵循 Master/Salve 架构,由三种不同类型的组件组成: client 提供了访问hbase的接口提供cache缓存提高访问hbase的效率 , 比如region的信息 Zookeeper保证任何时候,集群中只有一个 Master;存储所有 Region 的寻址入口&…

基于深度学习的高精度工人阶梯检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度工人阶梯检测识别系统可用于日常生活中或野外来检测与定位工人阶梯目标,利用深度学习算法可实现图片、视频、摄像头等方式的工人阶梯目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

Verilog基础:标识符的层次名引用

相关文章 Verilog基础:表达式位宽的确定(位宽拓展) Verilog基础:表达式符号的确定 Verilog基础:数据类型 Verilog基础:位宽拓展和有符号数运算的联系 Verilog基础:case、casex、ca…

Java8 Stream详解及创建流方法使用示例(二)

本章介绍Stream 创建流的操作:创建流指的是将一个集合或其他数据源转换为 Stream 流对象的过程。通常情况下,我们可以使用 Stream 类的静态方法来创建流对象,如 Stream.of()、Collections.stream() 等。这些方法将返回一个 Stream 流对象&…

【模块三:职业成长】35|模块导读:回过头来看,你觉得架构师到底是做什么的?

你好,我是郭东白。我们今天就正式进入模块三的学习了。 我们在开篇词里面介绍了,模块三的目的是向你介绍架构师的能力维度,以及获取这些能力的方法。既然是总结架构师成长的课程,那么“什么是架构师”就是一个绕不过去的话题。 …

操作系统-内存管理-虚拟内存管理

目录 一、虚拟内存定义和特征 二、请求分页管理 页表机制 缺页中断机构 地址变换机构 三、页面置换算法 3.1最佳置换算法(OPT) 3.2先进先出置换算法(FIFO) 3.3最近最久未使用置换算法(LRU) 3.4时钟置换算法(CLOCK) 3.4.1简单时钟置换算法 3.4.2改进型时钟置换算法 四、…

数据库—mysql、数据库编程(API)

1. Linux平台准备 &#xff08;1&#xff09;安装SDK开发包的命令 sudo apt-get install libmysqlclient-dev &#xff08;2&#xff09;编译时需要链接的库:-lmysqlclient 2. mysql 的初始化和清理 #include <mysql/mysql.h> MYSQL mysql1; //创建句柄 mysql_init(&…

springboot+java高校图书馆图书借阅挂失崔还系统

功本次设计任务是要设计一个图书借阅系统&#xff0c;通过这个系统能够满足图书借阅系统的管理及用户的图书借阅功能。系统的主要功能包括&#xff1a;主页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;借阅证件管理&#xff0c;挂失信息管理&#xff0c;图书信息管理…

华为OD机试真题 JavaScript 实现【快速寻找某字符】【牛客练习题】

一、题目描述 给定一个一个目标值 target和一个 元素升序的无重复数字字符串 &#xff0c;写一个函数搜索 字符串 中的 target&#xff0c;如果目标值存在返回下标&#xff08;下标从 0 开始&#xff09;&#xff0c;否则返回 -1。 二、输入描述 第一行输入一个目标值target…

pullup和pulldown在verilog中的使用方法

0 前言 这段时间涉及到了IO-PAD&#xff0c;在IO-PAD的RTL的时候注意到了pullup和pulldown&#xff0c;对这个知识比较好奇&#xff0c;就研究了一下&#xff0c;顺便记录下来&#xff0c;IO-PAD的内容等我再研究研究再考虑记录吧 >_< 1 pullup和pulldown的介绍 pullu…

springboot3错误处理机制源码分析

ErrorMvcAutoConfiguration 在springboot启动时会自动装配默认的错误处理机制 ErrorMvcAutoConfiguration springboot正在运行&#xff0c;此时发生了404的错误。&#xff08;业务错误场景&#xff09;分析底层处理流程。 1.如果在对应的controller层中设置了对应的错误处理器…

【裸机开发】链接脚本(.lds文件)的基本语法

目录 一、什么是链接脚本&#xff1f; 二、链接脚本的基本语法格式 1、常用命令 2、内置变量 三、链接脚本的简单案例 一、什么是链接脚本&#xff1f; 一段程序的编译需要经历四个阶段&#xff08;预处理—编译—汇编—链接&#xff09;&#xff0c;而链接脚本管理的就是…

专业实习报告范本4篇

专业实习报告范本1 一、实习起止日期&#xff1a; 二、实习单位及部门&#xff08;岗位&#xff09;&#xff1a; 三、主要实习内容&#xff1a; 对基础知识和专业理论知识的掌握及运用情况&#xff1a; 通过两年半的学习和两个月的紧张培训&#xff0c;让我学会了电路图的分析…

彻底关闭 Win10 系统自动更新【四大步骤】

Windows 10 的自动更新非常顽固&#xff0c;多用户在网上试了各种关闭win10自动更新的方法&#xff0c;刚开始看着好像是关闭更新了&#xff0c;可没过多久系统就又开始自动更新了。今天笔者就来教大家如何彻底关闭win10自动更新&#xff0c;该方法亲测有效。 一、禁用 Window…

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

文章目录 一、背景二、方法2.1 特征抽取和加强2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-sentence level text feature2.5 Loss Function 3、效果3.1 zero-shot transfer of grounding DINO3.2 Referring Object detection3.3 Ablations3.4 从 DI…

java springboot工程整合JUnit测试

好啦从此文开始 我们开始学习整合第三方技术的知识 后续 我们会整合一下第三方技术 后续也还会用到很多 但大家要学的是思想 而不是某某技术怎么去整合 当你会任何一种技术 你都能自如的整合到项目中 你才算掌握了整合技术 好 那么开始先整合 JUnit 我们打开idea 打开我们的 …