NIN网络《Network in Network》总结

一、文章意义

        这篇文章提出的“1*1”卷积对后续的研究还是有启发作用的,但是Global Average Pooling 好像影响不大,这篇文章也是在MaxoutNet的基础上进行改进的,Maxout能拟合任意的凸函数,NIN试图拟合任意的函数。

二、网络结构

         网络结构如下图所示:
        

          这篇文章里的网络结构是3个作者新提出来的“mlpconv”卷基层加1个作者新提出来的"Global Average Pooling"层。

三、模型特点

文章的特色分为两个部分:
1、作者对传统的卷基层进行改进,用MLP(多层感知机)构成一个微型网络(micro network),新的卷基层称为“mplconv”层;
2、提出"Global Average Pooling"层代替全连接层,将池化后的特征点组成特征向量直接送进Softmax层;
下面分别总结。

1、mlpconv

(1)mlpconv结构

          
            作者对传统的卷积操作进行改进,引入由MLP(多层感知机)组成的微型网络(micro netwrok),这里MLP等价于在传统卷积核后面接cccp层(cascaded cross channel parametric pooling),而cccp层等价于1*1卷积,因此文中的mlpconv,即等价于传统卷基层+两个1*1的卷基层(中间穿插着ReLU层)。(这一步步等价是为什么???)

(2)作者为什么要引入这个新的卷积操作?

           1、作者认为传统的GLM(广义线性模型)提取到的特征的抽象等级不高(“we argue that the level of abstraction is low with GLM”),即相同概念下的变量特征应该是相同的(“By abstraction we mean that the feature is invariant to the variants of the same concept”);
           2、当潜在概念(latent concepts)是线性可分的时候,GLM能获取好的抽象特征。然而,相同概念的数据一般存在于非线性的流形中,因此应用非线性模型;
           3、因此作者采用MLP+ReLU。因为MLP是一个通用的函数逼近器(function approximator),且可由神经网络反向传播进行训练,MLP与CNN相兼容,且可自行深度化。ReLU是增强网络的非线性性。

(3)关于“1*1”卷积

           文中也提到,这个微型网络最终等价于在传统的卷积操作后面跟上两个1*1卷积,每个1*1卷积分别跟ReLU,在caffe里也是这么实现的。在这里“1*1卷积”的作用在caffe中文社区有解释(而且网上基本都是这个解释...),地址在这里:点击打开链接 
           1、实现夸通道的交互和信息整合。即将不同的feature map线性组合成新的feature map,每一个卷积核对应一个新的feature map,卷积核的个数即输出特征图的通道数。由于1*1卷积核仅有一个参数,故是将若干张不同通道的feature map直接线性组合到一张feature map上(最后输出的feature map的个数取决于卷积核的个数);
           2、进行卷积和通道数的降维和升维。在GooLeNet中提及,总之就是减少参数数目,可以让网络做的更深;

(4)Caffe中的实现

           参考的这篇博客:点击打开链接
           下面是一个单层的mlpconv网络的caffe网络结构文件,源码来自于:点击打开链接
           我根据自己的理解添加了点注释
//conv1是传统卷积层
  layers {  
  bottom: "data"  
  top: "conv1"  
  name: "conv1"  
  type: CONVOLUTION  
  blobs_lr: 1  
  blobs_lr: 2  
  weight_decay: 1  
  weight_decay: 0  
  convolution_param {  
    num_output: 96  
    kernel_size: 11  
    stride: 4  
    weight_filler {  
      type: "gaussian"  
      mean: 0  
      std: 0.01  
    }  
    bias_filler {  
      type: "constant"  
      value: 0  
    }  
  }  
}  
//relu0是传统卷积层后接的ReLU层
layers {  
  bottom: "conv1"  
  top: "conv1"  
  name: "relu0"  
  type: RELU  
}  
//第一个1*1卷积网络,也是cccp层,因此name是cccp1
layers {  
  bottom: "conv1"  
  top: "cccp1"  
  name: "cccp1"  
  type: CONVOLUTION  
  blobs_lr: 1  
  blobs_lr: 2  
  weight_decay: 1  
  weight_decay: 0  
  convolution_param {  
    num_output: 96  //输出通道数(也是卷积核的个数)
    kernel_size: 1  //卷积核大小是1
    stride: 1  
    weight_filler {  
      type: "gaussian"  
      mean: 0  
      std: 0.05  
    }  
    bias_filler {  
      type: "constant"  
      value: 0  
    }  
  }  
}  
//第一个1*1卷基层后接的ReLU层,名字为relu1
layers {  
  bottom: "cccp1"  
  top: "cccp1"  
  name: "relu1"  
  type: RELU  
}  
//第二个1*1卷积网络,也是cccp层,因此name是cccp2
layers {  
  bottom: "cccp1"  
  top: "cccp2"  
  name: "cccp2"  
  type: CONVOLUTION  
  blobs_lr: 1  
  blobs_lr: 2  
  weight_decay: 1  
  weight_decay: 0  
  convolution_param {  
    num_output: 96  
    kernel_size: 1  //卷积核大小是1
    stride: 1  
    weight_filler {  
      type: "gaussian"  
      mean: 0  
      std: 0.05  
    }  
    bias_filler {  
      type: "constant"  
      value: 0  
    }  
  }  
}  
//第二个1*1卷积层后接的ReLU层,名字为relu2
layers {  
  bottom: "cccp2"  
  top: "cccp2"  
  name: "relu2"  
  type: RELU  
}  

2、Global Average Pooling

(1)引入Global Average Pooling的目的

           传统的CNN网络中,最后一个卷积层所得到的feature map被矢量化后送进全连接层,然后使用softmax进行分类。但是全连接层参数多,容易过拟合。因此作者在这篇文章中移除了全连接层,换上了Global Average Pooling层,这样做在较大程度上减小了参数个数,缓解了过拟合,有利于模型向更深的成熟发展,同时也减少了训练时间。

(2)具体操作

            这里参考的这篇博客:点击打开链接
            将卷积层的最后一层的特征图进行整张图的一个均值池化,即所有的像素值求平均,得到一个特征点,再将这些特征点组成最后的特征向量送进softmax层。比如最后一层是10个6*6的特征图,经过Global Average Pooling后10个feature map对应10个特征点,将这10个特征点组成一个1*10的特征向量,再送进softmax中。

(3)Caffe中的实现

           这里参考上面mlpconv中同一篇博客:点击打开链接
           按照这篇文章的架构,Global Average Pooling层的bottom应该是第二个1*1卷基层所跟的ReLU层,这里原博客的上一个层应该是AlexNet的,并不是这篇论文的架构。
           这里根据自己的理解加了点注释。
layers {  
bottom: "cccp8"  
top: "pool4"  
name: "pool4"  
type: POOLING  
pooling_param {  
pool: AVE  //Caffe里写好了
kernel_size: 6  //因为在AlexNet中最后的特征图大小是6*6,因此这里是6
stride: 1  //卷积核全部覆盖了就不用再滑动了,这里是1
}  

       还要说明的是这里训练的详细过程作者很多是参考的AlexNet和MaxoutNet,这里主要是介绍模型结构,等真要去仿真了再去细细研究,这部分才更贴近于实际。

四、Results

           这里作者分别在四个数据集:CIFAR-10、CIFAR-100、Street View House Numbers、MNIST上面进行测试的,结果如下:
     







讲道理效果不是很好,或者不是很明显。
作者又验证了Global Average Pooling的效果,如下图:

效果也不很是明显,但还是有效果的。

还有一点是作者在最后可视化了NIN网络的最后一个mlpconv层的输出,如图:

可以看出每一类在其正确的类的特征图上还是很明显的,尤其是第二个汽车,都能看出轮廓了,这难道就是feature map可视化的一个意义或者用处???

参考博客:
博客中哪里写的不对的,欢迎批评指正,因为有些我也拿不准。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值