Deep Learning-TensorFlow (12) CNN卷积神经网络_ Network in Network 学习笔记

来源:互联网 发布:吾生吾生有涯而知无涯 编辑:程序博客网 时间:2024/06/05 11:31

环境:Win8.1 TensorFlow1.0.1

软件:Anaconda3 (集成Python3及开发环境)

TensorFlow安装:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版)

TFLearn安装:pip install tflearn


参考:

1. Network In Network, Min Lin, Qiang Chen, Shuicheng Yan

2. Github: tflearn

3. Network in Network-读后笔记


1. 前言


回忆之前介绍的 Google Inception V1,采用分支级联的卷积层、MLPConv 层和全局平均池化层,构建了22层网络结构,使得很好地控制计算量和参数量的同时( AlexNet 参数量的1/12),获得了非常好的分类性能——top-5 错误率6.67%,在 ILSVRC 2014 的比赛中(和VGGNet 同年)以较大优势取得了第一名


其网络结构设计很大程度上借鉴了2014年 ICLR 的paper,Network In Network(以下简称 NIN )。这篇 paper 改进了传统的CNN网络,采用了少量参数进一步提高了 CIFAR-10、CIFAR-100 等数据集上的准确率,其提出的网络结构是对传统CNN 网络的改进:

  • 多层感知卷积层(Mlpconv Layer):使用 Conv+MLP 代替传统卷积层,增强网络提取抽象特征和泛化的能力;
  • 全局平均池化层(Global Average Pooling):使用平均池化代替全连接层,很大程度上减少参数空间,便于加深网络和训练,有效防止过拟合。

本文将针对这两点贡献展开,细节内容可以参考鸣祥简书 Network in Network-读后笔记,介绍地更为详细。


2. Mlpconv

CNN 一般由卷积层与池化层以栈的形式交替组成,卷积层通过使用非线性激活函数(如:ReLu)的线性组合产生特征图,其计算过程可表示为


一般来说,所要提取的特征是高度非线性的,在传统的 CNN 中尝试使用超完备的滤波器来提取各种潜在的特征,具体来说,当需要提取某个抽象特征时,我们初始化大量的滤波器去提取尽可能多的特征,将我们期望的特征也覆盖到。如此产生的结果是网络结构复杂,参数空间过大


事实上,CNN 高层特征其实是低层特征通过某种运算的组合。于是作者就根据这个想法,提出在每个局部感受野中进行更加复杂的运算,提出了对卷积层的改进算法:MLP卷积层。相对传统的卷积层过程,Mlpconv层可以看成是每个卷积的局部感受野中还包含了一个微型的多层网络:



利用多层 MLP 的微型网络,对每个局部感受野的神经元进行更加复杂的运算,提高非线性,其计算过程为:



选择多层感知器 MLP 作为微网络结构,作者作出以下两点说明:

  1. MLP 使用 BP 算法训练,与 CNN 高度整合;
  2. MLP 可自行深度化,作为深层结构包含了特征重用的思想。

NIN 级联的跨特征图(Feature Map)整合过程,可以使得网络学习到复杂和有用的跨特征图特征,细看 NIN 的 caffe 实现,在每个传统卷积层后面接了两个 cccp 层(cascaded cross channel parametric pooling),实际上为两个1×1的卷积层,因此跨通道的参数化感知层等效于一个卷积核为1*1 的卷积层:





在 tflearn 的 network_in_network.py 中,第一层 Mlpconv 的节点为:

network = input_data(shape=[None, 32, 32, 3])network = conv_2d(network, 192, 5, activation='relu')network = conv_2d(network, 160, 1, activation='relu')network = conv_2d(network, 96, 1, activation='relu')network = max_pool_2d(network, 3, strides=2)


这里采用 1*1 卷积层 作为 MLP 对卷积后的 Feature Map 进行跨通道信息整合,然后 ReLu,最后 Maxpooling。


1*1 卷积层 对往后的网络设计产生了深远的影响,同期的 VGG 也在网络中用于线性变换,但输入通道数和输出通道数不变,没有发生降维;在GoogleNetResNet 上也使用了1*1 卷积层,不仅可以跨通道组织信息,提高网络的表达能力,同时可以对输出通道升维和降维


3. Global Average Pooling


对于分类问题,最后一个卷积层的 Feature Map 通常与全连接层连接,最后通过 softmax 逻辑回归分类。全连接层带来的问题就是参数空间过大,容易过拟合。早期 Alex 采用了Dropout 的方法,来减轻过拟合,提高网络的泛化能力,但依旧无法解决参数过多问题。


NIN 提出采用全局均值池化的方法,替代传统 CNN 中的全连接层。与传统的全连接层不同,对每个特征图一整张图片进行全局均值池化,这样每张特征图都可以得到一个输出。这样采用均值池化,去除了构建全连接层的大量参数,大大减小网络规模,有效避免过拟合;另一方面的重要意义是,每张特征图相当于一个输出特征。例如 CIFAR-100分类任务,可直接将最后一层 Mlpconv 输出通道设为100,对每个 Feature Map 进行全局平均池化得到100维的输出向量。


因此使用全局平均 pooling 代替全连接层,使得最后一个多层感知卷积层获得的每一个特征图能够对应于一个输出类别,优点如下:

  1. 全局平均池化更原生的支持于卷积结构,通过加强特征映射与相应分(种)类的对应关系,特征映射可以很容易地解释为分类映射;
  2. 全局平均池化一层没有需要优化的参数,减少大量的训练参数有效避免过拟合;
  3. 全局平均池化汇总(求和)空间信息,因此其对空间变换是健壮的。


4. 总结


作者利用 Mlpconv 和 全局平均 pooling 建立了 Network in Network 网络结构:



同时在 CIFAR-10, CIFAR-100, SVHN and MNIST 数据集上取得了较好的实验效果,作者还可视化部分实验结果说明了 NIN 的效果,NIN 模型通过使用 MLPconv 可以接收一个更为强烈的局部感受野模型:



从网络结构设计和实验结果可以看出,NIN 的优势主要有下面三点:

  1. 更好的局部抽象;
  2. 更小的全局Overfitting;
  3. 更小的参数空间。

2 0