【泛读AI论文】 泛读+复现---- NiN(Network In Network)

前言

我是看完了Inception系列之后才来看的这个,实际上这篇论文应该在 Alex之后看比较合适。

论文题目:Network In Network

下载地址:https://arxiv.org/pdf/1312.4400.pdf

大致看了一下论文有10页,文章结构上也非常正规。

这篇论文是2013年的,Alex是2012年的,所以整篇论文应该都是在对比着Alex讨论的,也可以理解为对Alex的改进。

前面的论文我都是一段一段看,向精读靠拢,这一篇我向泛读靠拢,因为在之前的inception系列包括resent系列还有VGG这些论文中已经知道了 NiN主要贡献就是1 * 1卷积核的提出,还有全局平均池化代替全连接层。泛读的话我就不会像之前那样摘要,引言一点一点弄了,泛读就直接看核心,感觉这篇论文过的应该会比较快。

开始吧~

为什么要提出NIN模型

作者说CNN的广义线性模型GLM对局部的抽象能力不太行(传统的卷积+池化+激活的操作),这里的抽象能力我个人理解为将图片转换成编码的过程,或者是对图片局部像素特征的学习表达能力。

个人理解,实际上就是之后发现的,CNN低层只学习了局部像素,深层产生语义信息,只有加深网络深度或者加大卷积核也就是加大感受野,才能学习到更加深层的特征。但是感受野大小不能随便动,感受野大于图片大小,则整个图片都变成背景了,提取不到特征,若太小,则局部信息过多导致丢失全局信息。

作者改进的思路和方法

改进一:

为了让抽象能力进一步提升,作者将在卷积输出之前加入了全连接网络用于进一步的特征提取。
后来我们都知道,全连接实际上就等于1 * 1 卷积层,这里也解决了上面提出的那个问题,不增加感受野大小,通过增加卷积层从而使模型学习到更多的特征。

基于这个思想作者提出了他所构建的块模型,称作 mlpconv。

作者直接给出下图,普通卷积(左),加入mlpconv结构的卷积(右)。

在这里插入图片描述
图片一目了然,作者的模型在卷积输出之前加入了全连接层(MLP),用于特征的进一步提取。

这里顺带说一下,操作过程是一个感受野出来之后直接给一个MLP,得到一个值,然后再继续滑动计算下一个值,最终得到一整个feature map。

改进二:

利用全局平均池化(GAP)代替传统CNN最后的全连接层。

这样做的原因:

  • 全连接层相当于黑盒,可解释性差。
  • 全连接层依赖dropout,容易过拟合。
  • 减小网络整体的参数量。
  • GAP汇聚了空间信息。对输入的空间转换更具鲁棒性。

具体的操作过程:在最后一个mlpconv层生成一个分类任务中相应类别的特征图。没有在特征图最顶端增加全连接层,而是求每个特征图的平均值,得到的结果向量直接输入softmax层。

NIN网络结构

在这里插入图片描述
简单明了,三个mlpconv块堆叠 ,最后再加一个GAP全局平均池化。

每一个mlpconv中的结构是 1卷积+2全连接

代码复现

Pytorch实现全局平均池化(GAP):

有API,直接调用,

AdaptiveAvgPool2d((x,y))

这个自适应平均池化,其实放到最后就是全局平均池化的效果,里面俩参数是输出的大小。这里面的padding和步长都是自动的不用管。

Pytorch实现NIN块:


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

Pytorch实现NIN模型结构:

NiN = nn.Sequential(
    nin_block(1, 96, kernel_size=11, stride=4, padding=0),
    nn.MaxPool2d(3, stride=2),
    nin_block(96, 256, kernel_size=5, stride=1, padding=2),
    nn.MaxPool2d(3, stride=2),
    nin_block(256, 384, kernel_size=3, stride=1, padding=1),
    nn.MaxPool2d(3, stride=2),

    nn.Dropout(0.5),
    nin_block(384, 10, kernel_size=3, stride=1, padding=1),
    nn.AdaptiveAvgPool2d((1, 1)),
    nn.Flatten()
)

小总结

论文主要贡献就是提出1 * 1 的卷积和GAP替代FC。

引言第一段直接介绍了一下什么是 特征图 feature map,就是 通过卷积,池化,激活函数之后得到的结果就叫feature map。额,在论文里解释什么是feature map看着好像是废话,不过那是因为我没按顺序看论文,我服了。这篇论文确实应该早点看的,在看完AlexNet就应该看这篇论文,想我刚开始看论文的时候,看到ZFnet里面的feature map还蒙了好久,要是当时看完这篇再去看ZFnet 就会很顺了。

摘要中一个单词 patches,直接去百度翻译就是补丁,实际上这个单词的意思和batch size差不多,就是一张图片处理不过来了,将其分解成一个一个的小块,这一个一个的小块就是patches。

论文中多次提到Maxout,实际上就是一种激活函数,和sigmoid Relu一样,他有Relu所有的优点,并且还没有Relu的缺点(神经元死亡),Maxout的缺点就是参数量爆炸。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值