深度学习之CNN深度卷积神经网络-Network in Network(进阶)

在这里插入图片描述

前言

本文主要CNN系列论文解读——Network in Network的简介、模型结构、网络结构的代码实现等。

在这里插入图片描述

【论文解读】CNN深度卷积神经网络-Network in Network

1.简介

《Network in Network》是原于2013年发表的论文,论文中描述了一种新型卷积神经网络结构,就叫做Network in Network(NIN)。 LeNet,AlexNet,VGG都秉承一种设计思路:先用卷积层构成的模块提取空间特征,再用全连接层模块来输出分类结果。这里NIN提出了一种全新的思路:由多个由卷积层+全连接层构成的微型网络(mlpconv)来提取特征,用全局平均池化层来输出分类。这种思想影响了后面一系列卷积神经网络的设计。

2.Abstract

Abstract
We propose a novel deep network structure called “Network In Network”(NIN)to enhance model discriminability for local patches within the receptive field. Theconventional convolutional layer uses linear filters followed by a nonlinear acti-vation function to scan the input. Instead, we build micro neural networks withmore complex structures to abstract the data within the receptive field. We in-stantiate the micro neural network with a multilayer perceptron, which is a potentfunction approximator. The feature maps are obtained by sliding the micro net-works over the input in a similar manner as CNN; they are then fed into the nextlayer. Deep NIN can be implemented by stacking mutiple of the above describedstructure. With enhanced local modeling via the micro network, we are able to utilize global average pooling over feature maps in the classification layer, which iseasier to interpret and less prone to overfitting than traditional fully connected layers. We demonstrated the state-of-the-art classification performances with NIN on CIFAR-10 and CIFAR-100, and reasonable performances on SVHN and MNIST datasets
翻译
我们提出一种新的深层网络结构,称为“网络中的网络”(NIN),以提高模型对感受野内局部特征块的辨识能力。传统的卷积层使用线性滤波器和非线性激活函数对处理输入。相反,我们构建具有更复杂结构的微神经网络来抽象感受野中的数据。我们用多层感知器建立了微型神经网络,它是一个有效的函数逼近器。将微型神经网络在输入上滑动,得到特征图,方法与CNN相似;然后它们被送入下一层。通过上述结构的多重叠加,可以实现深层NIN。通过微网络增强的局部建模,我们能够利用分类层的特征图上进行全局average pooling,这比传统的全连接层更容易解释,也更不容易发生过拟合。我们使用NIN在CIFAR-10和CIFAR-100达到了最佳的分类性能,并在SVHN和MNIST数据集上也表现出色。

3.网络结构

3.1 示意图

在这里插入图片描述

图1:线性卷积层与MLP层(多层感知机)的比较。 (a)为线性卷积层,包含一个线性滤波器;而(b)是一个微型网络MLP层(论文中使用的是b)。


在这里插入图片描述

图2.jpg

图2:论文中Network in Network整体架构,包含三个MLP层+一个全局average pooling层

3.2 Network特点

  • NIN由三个mplconv层 + 一个GAP全局平均池化层组成
  • 一个mplconv即一个微型神经网络,故整体架构称为NIN:Network in Network
  • 微型网络mplconv,内部由多层感知机实现(其中包含1个conv层+2个fc层)
  • mpl中感知机层数是可以调整的;同样mlpconv层作为一个微型网络结构,也可以被用在卷积层之间,个数随需调整。
  • NIN网络用微型网络mlpconv层代替了传统的卷积层;用GAP代替了传统CNN模型中末尾的全连接层。目的和优势见论文解读。

4.论文解读

1.介绍

卷积神经网络由卷积层和池化层交替组成。卷积层取线性filter和感受野的内积,然后在输入的每个局部用非线性激活函数,产生的结果称为特征图。作者认为,传统CNN中卷积filter相当于一个广义线性模型(GLM),而GLM的抽象水平较低,用更有效的非线性函数逼近器代替GLM可以增强局部模型的抽象能力。这里讲抽象能力高,是指当输入有局部变化时,输出特征保持不变。

在NIN中,GLM被一个“微型网络”结构代替,这就是一个通用的非线性函数逼近器。论文中的微型网络用多层感知机实现,故将此微型网络称为mplconv,其不仅是一个通用的函数逼近器,还可以通过反向传播进行计算。函数逼近器的概念即利用函数去逼近和拟合一组数据的分布,譬如一组数据大致呈现直线状分布,y = kx + b即可作为一个函数逼近器,一组数据呈现抛物线状,可用y = kx^2 + b作为逼近器。

论文中的网络架构由多个mplconv叠加而成,故称为Network in Network(NIN)。 在NIN中最后的几层并没有用传统的全连接层,而是直接将最后一个mplconv的feature mas在空间上的均值(通道上取均值)通过GAP全局均值池化得到各个分类的置信度,最后送入softmax层进行分类。作者表示,传统的全连接层就相当于一个黑箱,反向传播时,很难解释图像分类的类别信息是如何从全连接层传递到前面的卷积层,且全连接器严重依赖dropout,否则会导致过拟合的问题;作为对比,GAP这样的设计更有意义,可解释性更好,因为其突出了feature maps和类别之间对应的关系,而且GAP本身就是一个结构正则化器,天然防止过拟合。

2.卷积神经网络

3.Network in Network

经典的卷积神经网络由交替堆叠的卷积层和空间池化层组成。卷积层通过线性卷积filter生成特征图,然后经过非线性激活函数(整流器、sigmoid、tanh等)处理。经典的卷积过程,计算特征图如下:[图片上传失败...(image-b31677-1583758746922)]这里(i,j)表示计算得到的特征图的像素坐标;xij表示一个以i,j为中心的输入块,k用来表示特征图的通道维数。

这里作者提到(1.Introduction中也提及),当潜在的待分类图像是线性可分时,通常这类卷积计算是没问题的,但当目标抽象度较高,这类线性函数逼近器就无法较好的工作,于是在卷积后通常加上relu等非线性激活单元来提高非线性部分来提高非线性。

当潜在特征的实例是线性可分的时,CNN的线性卷积是可以胜任的。然而,实现良好抽象通常意味着输入数据的高度非线性。在传统的CNN中,可以通过大量使用filter来捕捉特征的不同变体,不过针对单个特征实例使用大量filter会给下一层的计算打来很大开销(因为下一层的特征往往较大,而它需要综合和计算来自上一层特征的所有变化组合)。基于此,作者认为在将每个局部特征组合成更高级特征之前,对其进行更好的抽象将是有益的。于是通过网络结构中引入微型网络(MLP)来实现这一点,MLP的作用即为局部特征块提取出更抽象的特征,从而在送入下一层之前,增加抽象性。

作者还提到,Maxout Network通过最大池化可以大幅减少卷积后特征图的数量,线性函数的最大化使得分段线性逼近器能够逼近任何凸函数。 与常规卷积层相比,maxout网络更有效,因为它可以分离凸集内的特征。 这项改进使maxout网络在多个基准数据集上具有最佳性能。然而这里的前提是:所有特征都处于空间中的凸集内,所以这并不通用,而作为对比NIN的结构就是更通用的函数逼近器。

3.1 MLP卷积层

在特征的分布情况未知的情况下,通过使用更通用的函数逼近器来对局部块进行提取,因为更能逼近特征的抽象表示。Radial basis network和多层感知机(MLP)是常用的通用函数逼近器,我们选择MLP的目的有2:

  • 1.MLP和卷积层良好兼容
  • 2.MLP本来就是深度模型,符合特征重用的思想

mlpconv的计算过程如下:[图片上传失败...(image-60f760-1583758746923)]n表示MLP的layer层数,MLP中同样用线性整流单元(relu)做激活函数。

从跨通道池化的角度来看,公式等效于在正常卷积层上进行级联跨通道参数池化。每个池化层在输入的特征图上进行加权线性重组,然后通过relu,特征在一层层的跨通道池化中被交叉重组,使得各channel上的特征可跨通道交互和互相学习。这样的结构等价于1×1卷积(同样可以合并多通道,使得各个channel上的参数可交互),故在代码实现中mlpconv中的全连接层,也可以用1×1的conv层来等价代替。

3.2 全局平均池化GAP

传统CNN结构中卷积层后跟着的是全连接层然后经softmax层输出分类,最后的全连接层有增加过拟合的风险;这里作者将全连接层替换成了GAP全局平均池化层。 作者在论文中表面,用GAP替换了传统FC层主要有两点优势:

  • 1.增强了特征映射和类别之间的对应关系,更符合卷积的结构,因此特征图就更容易对应上最后要输出分类的类别置信度;
  • 2.没有了全连接层,减少了大量需要学习的参数,也避免了FC层过拟合的发生。

此外,全局平均池化汇总了空间信息,因此对输入特征的空间转换更加加健壮。

3.3 NIN结构

在这里插入图片描述

如图,是一个NIN的结构,包括3个mplconv层 + 1个全局平均池化层,一个mplconv中是一个3层的感知机(1卷积层+2个全连接层)
作者表示,mpl中感知机层数是可以调整的,同样mlpconv层作为一个微型网络结构,也可以被用在卷积层之间,个数随需调整。

4. 实验

4.1概述

作者评估了四个基准数据集:CIFAR-10,CIFAR-100,SVHN和MNIST,所有的训练均采用上图中的NIN结构。
除最后一个mplconv外,所有层都应用了dropout,另外也使用了Krizhevsky等人使用的weight decay用于正则化。具体的训练采用了类似Krizhevsky的训练步骤,batch size = 128,从初始学习率开始训练,直到准确率停止提高,再将学习率降低10倍,最后再降低10倍,直到训练结束。

4.2 CIFAR-10

CIFAR-10数据集由50000个训练图像和10000个测试图像,图像大小32×32的3通道图片,总共10个分类。 在CIFAR-10上,NIN取得了10.41%的训练误差,比之前最好成绩提高了1%以上。

4.3 CIFAR-100

CIFAR-100的图像数量和尺寸于CIFAR-10相同,只是分类种类增加至了100个类。NIN+Dropout的效果能达到测试误差35.68%,也超过了目前最佳实现。

在这里插入图片描述

4.4 SVHN

SVHN数据集是谷歌街景门牌号数据集,由630420个32×32的RGB图像组成。在此数据集上得到分类错误率为2.35%。

在这里插入图片描述

4.5 MNIST

MNIST为手写数字识别经典数据集,包含60000张训练图像和10000张测试图,28×28的单通道图像。此次测试的模型结构和CIFAR-10一样,只是由于MNIST更简单,所以这里没有使用数据扩增。

在这里插入图片描述

得到分类测试错误率为0.47%,接近当前最好的水平0.45%

4.6 GAP做正则化器

这里主要在数据集CIFAR-10上比较了mlpconv+传统全连接层和mlpconv+ GAP(全局平均池化)两种结构的训练效果,结果表面mplconv + GAP效果好于前者。

在这里插入图片描述

4.7NIN的可视化

在这里插入图片描述

5.总结

针对分类任务,论文提出了一种新的深度网络——网络中的网络(NIN)。这个新结构由mlpconv层和一个GAP全局平均池化层组成,其中MLP层由多层感知器组成,并用来卷积输入,而GAP层用于替代常规CNN中的的FC层。
Mlpconv层可以更好地对局部特征块建模;而GAP则可以用于防止过拟合,当做正则化器使用。正是由于这样的结构设计,才在CIFAR-10、CIFAR-100和SVHN数据集中取得优异成绩。 通过特征图的可视化,我们证明了NIN的最后一个mlpconv层的特征图是类别的置信度图,这让我们看到了通过NIN执行目标检测的可能。
HN

5.代码实现

这里使用tensorflow2.0实现网络结构,而不是完整的训练。
下面我们首先构造NIN中的结构块:

import tensorflow as tf


def nin_block(num_channels, kernel_size, strides, padding):
    blk = tf.keras.models.Sequential()
    blk.add(tf.keras.layers.Conv2D(num_channels, kernel_size,
                                   strides=strides, padding=padding, activation='relu')) 
    blk.add(tf.keras.layers.Conv2D(num_channels, kernel_size=1,activation='relu')) 
    blk.add(tf.keras.layers.Conv2D(num_channels, kernel_size=1,activation='relu'))    
    return blk

然后在整个NIN中,依次叠加4个mlpconv块,最后加上全局平均池化层。

net = tf.keras.models.Sequential()
net.add(nin_block(96, kernel_size=11, strides=4, padding='valid'))
net.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2))
net.add(nin_block(256, kernel_size=5, strides=1, padding='same'))
net.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2))
net.add(nin_block(384, kernel_size=3, strides=1, padding='same'))
net.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2))
net.add(tf.keras.layers.Dropout(0.5))
net.add(nin_block(10, kernel_size=3, strides=1, padding='same'))
net.add(tf.keras.layers.GlobalAveragePooling2D())
net.add(tf.keras.layers.Flatten())

构造一个224×224×3的图片来看一下每一层输出的shape

X = tf.random.uniform((1,224,224,3))
for blk in net.layers:
    X = blk(X)
    print(blk.name, 'output shape:\t', X.shape)

输出:

sequential_1 output shape:   (1, 54, 54, 96)
max_pooling2d output shape:  (1, 26, 26, 96)
sequential_2 output shape:   (1, 26, 26, 256)
max_pooling2d_1 output shape:    (1, 12, 12, 256)
sequential_3 output shape:   (1, 12, 12, 384)
max_pooling2d_2 output shape:    (1, 5, 5, 384)
dropout output shape:    (1, 5, 5, 384)
sequential_4 output shape:   (1, 5, 5, 10)
global_average_pooling2d output shape:   (1, 10)
flatten output shape:    (1, 10)

在《动手学深度学习》-tf2.0版一书中,有完整的训练代码。完整训练可参考:网络中的网络(NiN)

6.总结

Network in Network提出了一种全新的模型设计:用微型网络层MLP代替了传统conv层;用GAP全局平均池化代替了传统的FC层实现分类输出。
mlp概述:

  • 1.本身和卷积层兼容,且为深度模型,符合特征重用的思想;其中的全连接层等价于1×1卷积。
  • 2.为局部特征块提取出更抽象的特征,从而在送入下一层之前,增加抽象性,从而提高模型整体的通用性。

GAP概述:

  • 1.没有了全连接层,减少了大量需要学习的参数,也降低了FC层过拟合的发生,起到正则化器的效果。
  • 2.增强了特征映射和类别之间的对应关系,更符合卷积的结构,因此特征图就更容易对应上最后要输出分类的类别置信度;
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

辣椒种子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值