系统学习深度学习(十八)--NIN模型
转自:http://blog.csdn.net/mounty_fsc/article/details/51746111
补充:http://blog.csdn.net/sheng_ai/article/details/41313883
http://blog.csdn.net/hjimce/article/details/50458190
《Network in Network》论文笔记
1.综述
这篇文章有两个很重要的观点:
1×1卷积的使用
文中提出使用mlpconv网络层替代传统的convolution层。mlp层实际上是卷积加传统的mlp(多层感知器),因为convolution是线性的,而mlp是非线性的,后者能够得到更高的抽象,泛化能力更强。在跨通道(cross channel,cross feature map)情况下,mlpconv等价于卷积层+1×1卷积层,所以此时mlpconv层也叫cccp层(cascaded cross channel parametric pooling)。CNN网络中不使用FC层(全连接层)
文中提出使用Global Average Pooling取代最后的全连接层,因为全连接层参数多且易过拟合。做法即移除全连接层,在最后一层(文中使用mlpconv)层,后面加一层Average Pooling层。
以上两点,之所以重要,在于,其在较大程度上减少了参数个数,确能够得到一个较好的结果。而参数规模的减少,不仅有利用网络层数的加深(由于参数过多,网络规模过大,GPU显存等不够用而限制网络层数的增加,从而限制模型的泛化能力),而且在训练时间上也得到改进。
2.网络结构
传统的convolution层
单通道mlpconv层
跨通道mlpconv层(cccp层)
由图可知,mlpconv=convolution+mlp(图中为2层的mlp)。
在caffe中实现上,mlpconv=convolution+1×1convolution+1×1convolution(2层的mlp)
3.Caffe中的实现
原文3层mlpconv的完整网络结构
Caffe中4层网络示意图(ImageNet)
说明:
1.方框为网络层,椭圆为blob
2.黄色pool4为Average Pooling
caffe网络数据数据如下(crop size=224)
Layer | channels | Filter size | Filter stride | Padding size | Input size |
---|---|---|---|---|---|
conv1 | 96 | 11 | 4 | - | 224×224 |
cccp1 | 96 | 1 | 1 | - | 54×54 |
cccp2 | 96 | 1 | 1 | - | 54×54 |
pool1 | 96 | 3 | 2 | - | 54×54 |
conv2 | 256 | 5 | 1 | 2 | 27×27 |
cccp3 | 256 | 1 | 1 | - | 27×27 |
cccp4 | 256 | 1 | 1 | - | 27×27 |
pool2 | 256 | 3 | 2 | - | 27×27 |
conv3 | 384 | 3 | 1 | 1 | 13×13 |
cccp5 | 384 | 1 | 1 | - | 13×13 |
cccp6 | 384 | 1 | 1 | - | 13×13 |
pool3 | 384 | 3 | 2 | - | 13×13 |
conv4-1024 | 1024 | 3 | 1 | 1 | 6×6 |
cccp7-1024 | 1024 | 1 | 1 | - | 6×6 |
cccp8-1000 | 1000 | 1 | 1 | - | 6×6 |
pool4-ave | 1000 | 6 | 1 | - | 6×6 |
accuracy | 1000 | - | - | - | 1×1 |
- 对于crop size = 227,则input size的变化为227, 55, 27, 13, 6, 1。
4. 1×1卷积的作用
以下内容摘抄自:http://www.caffecn.cn/?/question/136
问:发现很多网络使用了1X1卷积核,这能起到什么作用呢?另外我一直觉得,1X1卷积核就是对输入的一个比例缩放,因为1X1卷积核只有一个参数,这个核在输入上滑动,就相当于给输入数据乘以一个系数。不知道我理解的是否正确
答1:
对于单通道的feature map和单个卷积核之间的卷积来说,题主的理解是对的,CNN里的卷积大都是多通道的feature map和多通道的卷积核之间的操作(输入的多通道的feature map和一组卷积核做卷积求和得到一个输出的feature map),如果使用1x1的卷积核,这个操作实现的就是多个feature map的线性组合,可以实现feature map在通道个数上的变化。接在普通的卷积层的后面,配合激活函数,就可以实现network in network的结构了(本内容作者仅授权给CaffeCN社区(caffecn.cn)使用,如需转载请附上内容来源说明。)
答2:
我来说说我的理解,我认为1×1的卷积大概有两个方面的作用吧:
1. 实现跨通道的交互和信息整合
2. 进行卷积核通道数的降维和升维
下面详细解释一下:
1. 这一点孙琳钧童鞋讲的很清楚。1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释,认为文中提出的MLP其实等价于在传统卷积核后面接cccp层,从而实现多个feature map的线性组合,实现跨通道的信息整合。而cccp层是等价于1×1卷积的,因此细看NIN的caffe实现,就是在每个传统卷积层后面接了两个cccp层(其实就是接了两个1×1的卷积层)。
2. 进行降维和升维引起人们重视的(可能)是在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)。
最近大热的MSRA的ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入和输出的通道数都减小,参数数量进一步减少,如下图的结构。(不然真不敢想象152层的网络要怎么跑起来TAT)
[1]. https://gist.github.com/mavenlin/d802a5849de39225bcc6
[2]. http://www.caffecn.cn/?/question/136
补充个实验结果:
系统学习深度学习(十八)--NIN模型相关推荐
- 系统学习深度学习(三十八)--深度确定性策略梯度(DDPG)
转自:https://www.cnblogs.com/pinard/p/10345762.html 1. 从随机策略到确定性策略 从DDPG这个名字看,它是由D(Deep)+D(Determinist ...
- 花书+吴恩达深度学习(二十)构建模型策略(超参数调试、监督预训练、无监督预训练)
目录 0. 前言 1. 学习率衰减 2. 调参策略 3. 贪心监督预训练 4. 贪心逐层无监督预训练 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十 ...
- 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言
嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...
- 系统学习深度学习(博客转载地址)
转载深度学习学习系列的一些文章 1. 系统学习深度学习(一) --深度学习与神经网络关系 https://blog.csdn.net/app_12062011/article/details/5431 ...
- 系统学习深度学习(一) --深度学习与神经网络关系
参考:http://blog.csdn.net/zouxy09/article/details/8775518 最近开始学习深度学习,基本上都是zouxy09博主的文章,写的蛮好,很全面,也会根据自己 ...
- MATLAB学习笔记(十八)
MATLAB学习笔记(十八) 一.Simulink仿真基础 1.1 Simulink的启动 1.2 系统仿真模型的创建 1.3 仿真参数的设置 1.4 总结 二.子系统的创建与封装 2.1 子系统的创 ...
- 系统学习深度学习(四十一)--AlphaGo Zero强化学习原理
转自:https://www.cnblogs.com/pinard/p/10609228.html 本篇主要参考了AlphaGo Zero的论文, AlphaGo Zero综述和AlphaGo Zer ...
- 堆栈——Windows核心编程学习手札之十八
堆栈 --Windows核心编程学习手札之十八 堆栈可以用来分配许多较小的数据块,可以不考虑分配粒度和页面边界之类的问题,但分配和释放内存块的速度比其他机制要慢,并且无法直接控制物理存储器的提交和回收 ...
- OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc
OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...
- 【杂谈】2020年如何长期、系统,全面地学习深度学习和计算机视觉,这是有三AI的完整计划...
对深度学习从业者要说的话 深度学习的前身是神经网络,属于机器学习技术中的一种,诞生于半个多世纪以前,随着计算硬件水平的提升,工业大数据的积累以及相关理论的完善,如今得以在各行各业大展拳脚.从应用领域来 ...
最新文章
- 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...
- Shell关于Wget命令的使用技巧
- shell实例第15讲:俄罗斯方块游戏
- iOS UICollectionView的实现
- 微信又添新功能!这个微信群可以学英语,而且全程免费
- 2020解决连不上GitHub github.com port 443: Timed out
- rk3399_android7.1调试lsm9ds1三合一sensor记录
- java内置的四大函数式接口
- 前端|Ant Design介绍
- 如何选择合适的离心机,有哪些重要参数——TFN FUP LB6CM 落地式低速大容量冷冻离心机
- 计算机系统结构层次划分,网络的体系结构及其划分所遵循的原则
- 详解Web安全攻防战(DoS攻击、CSRF、XSS、SQL注入)
- html怎么设置左侧区域宽度,【CSS】左侧定宽、右侧宽度自适应布局
- 总结2019,憧憬2020
- 工控主板定制ARM9选择思路
- BIOS、EFI与UEFI详解
- 云产品流转 - 实现小车和微信小程序之间的通信(M2M通信)
- Mybatis 源码解析(六) Mybatis方言支持
- android电视 优酷视频,将优酷视频投屏到智能电视上,竟然还有这种操作
- window.close
热门文章
- 解决C++中multiple definition of问题
- python基础系统性学习
- 阿里python400集_自学成才的阿里大牛整理的400集自用Python视频资料,万物皆可爬...
- vue上传图片文件到服务器,vue如何将quill图片上传到服务器
- windows系统bat批处 注册一个exe执行文件变成服务
- 通过内网穿透 将本地端口 使其外网可以进行访问 使用花生壳内网穿透 网站访问
- 用递归和非递归实现斐波那契数列
- node mysql sequlize_玩转Node.js-Sequelize基础
- 字段定义_联系人字段随需自定,知己知彼快速签单
- Java中this关键字的详解