• NIN (Network In Network)


    Network In Network

    论文Network In Network(Min Lin, ICLR2014).

    传统CNN使用的线性滤波器是一种广义线性模型(Generalized linear model,GLM)。所以用CNN进行特征提取时,其实就隐含地假设了特征是线性可分的,可实际问题往往是难以线性可分的。CNN中通过堆加卷积过滤器来产生更高层的特征表示,作者想到了除了像之前一样堆加网络卷积层之外,还可以在卷积层里边做特殊的设计,使得网络能够在每个感受域提取更好的特征.

    mlpconv

    maxout能够拟合任何凸函数,也就能够拟合任何的激活函数(默认了激活函数都是凸的),而NIN想表明它不仅能够拟合任何凸函数,而且能够拟合任何函数,因为它本质上可以说是一个小型的全连接神经网络.

    NIN使用多层感知器的原因是MLP的结构与CNN兼容,都可以使用反向传播训练,并且也是个深度模型,与特征重用的理念一致.将MLP构成的网络层称为一个mlpconv层.MLP可以拟合任意形式的函数,线性、非线性的都可以.

    线性卷积层和mlpconv层的区别如图所示:

    nin-1

    mlpconv中使用ReLU,并未替换掉激活函数,改变的只是卷积的方式:不再是element-wise形式的乘积,而是用非线性的MLP + ReLU完成。其目的是引入更多的非线性元素。

    如下图的NIN结构:

    nin-structure

    第一个卷积核是11x11x3x96,因此在一个patch块上卷积的输出是1x1x96的feature map(一个96维的向量).在其后又接了一个MLP层,输出仍然是96.因此这个MLP层就等价于一个1 x 1 的卷积层,这样工程上任然按照之前的方式实现,不需要额外工作.

    Global Average Pooling

    传统的cnn是在较低层使用卷积,如分类任务中,最后的卷积层所得feature map被矢量化进行全连接层,然后使用softmax 回归进行分类。一般来说,在卷积的末端完成的卷积与传统分类器的桥接。全连接阶段易于过拟合,妨碍整个网络的泛化能力,一般应有一些规则方法来处理过拟合。

    在传统CNN中很难解释最后的全连接层输出的类别信息的误差怎么传递给前边的卷积层.而global average pooling更容易解释.另外,全连接层容易过拟合,往往依赖于dropout等正则化手段.

    global average pooling的概念非常简单,分类任务有多少个类别,就控制最终产生多少个feature map.对每个feature map的数值求平均作为某类别的置信度,类似FC层输出的特征向量,再经过softmax分类.其优点有:

    1. 参数数量减少,减轻过拟合(应用于AlexNet,模型230MB->29MB);
    2. 更符合卷积网络的结构,使feature map和类别信息直接映射;
    3. 求和取平均操作综合了空间信息,使得对输入的空间变换更鲁棒(与卷积层相连的FC按顺序对特征进行了重新编排(flatten),可能破坏了特征的位置信息).
    4. FC层输入的大小须固定,这限制了网络输入的图像大小.

    FC与global average pooling的区别如下图:

    global average pooling

    可用于图像分类,目标检测等任务.

    global average pooling实现使用Average Pooling,kernel_size是特征图的大小. caffe prototxt定义如下:

    layers {
      bottom: "cccp8"
      top: "pool4"
      name: "pool4"
      type: POOLING
      pooling_param {
        pool: AVE
        #kernel_size: 6
        #stride: 1
        #--旧版caffe需指定kernel_size&stride--
        global_pooling: true
      }
    }
    

    caffe在该论文之后加入了对global_pooling的支持,在pooling_param中指定global_pooling: true即可,不需要指定kernel大小,pad和stride大小(pad = 0 , stride = 1,否则会报错).kernel_size自动使用特征图的大小,代码:

    if (global_pooling_) {
        kernel_h_ = bottom[0]->height();
        kernel_w_ = bottom[0]->width();
    }
    

    论文的caffe模型参数定义gist.

    模型结构图源于绘制caffe prototxt模型结构的在线工具.

  • 相关阅读:
    思考:缓存的使用?灵活运用?
    线程和并发--基础
    java基础--方法
    java基础--数组
    数据结构复习笔记
    asp搭建网站
    转换磁盘格式
    cypress 与其他测试框架的区别
    cypress启动时报错file already exists,文件已经存在解决办法
    cypress的安装
  • 原文地址:https://www.cnblogs.com/makefile/p/nin.html
Copyright © 2020-2023  润新知