【导读】今天将主要介绍Inception的家族及其前世今生.Inception 网络是 CNN 发展史上一个重要的里程碑。在 Inception 出现之前,大部分 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。而Inception则是从网络的堆叠结构出发,提出了多条并行分支结构的思想,后续一系列的多分支网络结构均从此而来。总体来说,Inception系列网络在结构上相对比较复杂,工程性较强,而且其中通常使用很多tricks来提升网络的综合性能(准确率和速度)。目前Inception系列具体网络结构包括:

  1. Inception v1

  2. Inception v2

  3. Inception v3

  4. Inception v4

  5. Xception

  6. Inception Convolution with Efficient Dilation Search(CVPR2021 oral)

详细代码可查看:https://github.com/murufeng/awesome_lightweight_networks/tree/main/light_cnns/Inception

Going Deeper with Convolutions (GoogleNet)

  • 论文地址:https://arxiv.org/abs/1409.4842

Inception-v1就是2014年ImageNet竞赛的冠军-GoogLeNet,它的名字也是为了致敬较早的LeNet网络。GoogLenet架构的主要特点是更好地整合了网络内部的计算资源,并且精心设计了一个新的Inception模块,该模块允许增加网络的深度和宽度,同时保持计算资源不变.原始的Inception模块如下图所示:

原始的Inception模块主要包含几种不同大小的卷积,即1x1卷积,3x3卷积和5x5卷积,还有一个3x3的max pooling层。这些卷积层和pooling层得到的特征concat在一起作为最终的输出,即下一个模块的输入。

GoogLenet在Inception模块基础上进行改进。具体结构如下图所示:

首先使用1x1的卷积来进行升降维,这样就巧妙地解决了针对采用较大的卷积核计算复杂度较大这一问题;然后再在多个不同尺度上运用不同大小的卷积核同时进行卷积,最后将特征进行聚合。

具体网络结构如下所示:

  • 代码实现

import torch
from light_cnns import googlenet
model = googlenet()
model.eval()
print(model)
input = torch.randn(1, 3, 224, 224)
y = model(input)
print(y.size())

Inception v2 & Inception v3

- 论文地址:https://arxiv.org/abs/1512.00567

Inception v2 和 Inception v3 均来自同一篇论文《Rethinking the Inception Architecture for Computer Vision》,作者提出了一系列能增加准确度和减少计算复杂度的修正方法。

Inceptionv2针对InceptionV1改进的点主要有:

  1. 引入了BN层来对中间特征进行归一化。使用BN层之后,可以加快收敛速度,防止模型出现过拟合.

  2. 使用因子分解的方法,主要包括:将 5×5 的卷积分解为两个 3×3 的卷积运算以提升计算速度;将 n*n 的卷积核尺寸分解为 1×n 和 n×1 两个卷积.

  3. 扩展模型的宽度,来有效地解决表征性瓶颈问题。

网络结构如下所示:

  • 代码实现

import torch
from light_cnns import inception_v2
model = inception_v2()
model.eval()
print(model)
input = torch.randn(1, 3, 224, 224)
y = model(input)
print(y.size())

Inception Net v3 整合了前面 Inception v2 的特点,除此之外,还包括以下5点改进:

  1. 不再直接使用max pooling层进行下采样,因为这样导致信息损失较大。一个可行方案是先进行卷积增加特征channel数量,然后进行pooling,但是计算量较大。所以作者设计了另外一种方案,即两个并行的分支,如下图所示,一个是pooling层,另外一个卷积层,最后将两者结果concat在一起。这样在使用较小的计算量情形下还可以避免瓶颈层,ShuffleNet中也采用了这种策略。

  1. 使用RMSProp 优化器;

  2. Factorized 7x7 卷积;

  3. 辅助分类器使用了 BatchNorm;

  4. 使用了label smoothing;

  • 代码实现

import torch
from light_cnns import inception_v3
model = inception_v3()
model.eval()
print(model)
input = torch.randn(1, 3, 224, 224)
y = model(input)
print(y.size())

Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

  • 论文地址:https://arxiv.org/abs/1602.07261

Inception v4主要的motivation则是 Inception 架构和残差连接结合起来会是什么效果?如何有效地结合残差连接来显著加速 Inception 的训练? 下面主要介绍一下Inception v4是如何来解决上述问题的。Inception v4主要提出了以下几种改进:

  1. Inception v4 引入了一个新的stem模块,该模块放在Inception块之间执行。具体结构如下所示:

  1. 基于新的stem和Inception 模块,Inception v4重新提出了三种新的Inception模块分别称为 A、B 和 C

3.引入了专用的「缩减块」(reduction block),它被用于改变网格的宽度和高度。

网络结构如下所示:

  • 代码实现

import torch
from light_cnns import inception_v4
model = inception_v4()
model.eval()
print(model)
input = torch.randn(1, 3, 224, 224)
y = model(input)
print(y.size())

Xception: Deep Learning with Depthwise Separable Convolutions

  • 论文地址:https://arxiv.org/abs/1610.02357

基于Inception的模块,一个新的架构Xception应运而生。Xception取义自Extreme Inception,即Xception是一种极端的Inception.它的提出主要是为了解耦通道相关性和空间相关性。由于Inception模块首先使用1 1的卷积核将特征图的各个通道映射到一个新的空间,在这一过程中学习通道间的相关性;再通过常规的3 3或5 5的卷积核进行卷积,以同时学习空间上的相关性和通道间的相关性。但此时,通道间的相关性和空间相关性仍旧没有完全分离。而Xception通过提出深度可分离卷积则成功实现了将学习空间相关性和学习通道间相关性的任务完全分离,具体操作如下:

  1. 将Inception模块简化,仅保留包含3*3的卷积的分支:

  1. 将所有11的卷积进行拼接.

  1. 进一步增加3 3的卷积的分支的数量,使它与1 1的卷积的输出通道数相等:

  1. 此时每个3 3的卷积即作用于仅包含一个通道的特征图上,作者称之为“极致的Inception(Extream Inception)”模块,这就是Xception的基本模块。事实上,调节每个3 3的卷积作用的特征图的通道数,即调节3 3的卷积的分支的数量与1 1的卷积的输出通道数的比例,可以实现一系列处于传统Inception模块和“极致的Inception”模块之间的状态。

网络结构如下所示:

  • 代码实现

import torch
from light_cnns import xception
model = xception()
model.eval()
print(model)
input = torch.randn(1, 3, 224, 224)
y = model(input)
print(y.size())

Inception Convolution with Efficient Dilation Search(CVPR2021 oral)

  • 论文地址:https://arxiv.org/abs/2012.13587

为了充分挖掘空洞卷积的潜力,本文主要结合一种基于统计优化的简单而高效(零成本)的空洞搜索算法(EDO,effective dilation search)提出了一种新的空洞卷积变体,即inception (dilated)卷积.具体做法如下:

  1. 构建一个更灵活的搜索空间,可以使得模型能够具备将ERFs拟合到不同数据集的能力。于是本文提出一种新的膨胀卷积突变体,即Inception卷积,它包含尽可能多的膨胀模式。在Inception卷积空间中,每个轴、每个通道和每个卷积层的膨胀都是独立定义的。Inception卷积提供了一个密集的ERF范围.

  2. 然后提出了一种简单而高效的膨胀优化算法(EDO)。在EDO中,超网络的每一层都是一个标准的卷积操作,其内核覆盖了所有可能的膨胀模式。EDO以一种非常简单的方式支持完全扩张域搜索空间进行高效的通道扩张优化。与基于传统搜索的方法相比,EDO的搜索代价几乎为零。

网络结构如下:


代码实现:

import torch
from light_cnns import ic_resnet50
patter = './pattern_zoo/detection/ic_resnet50_k9.json'
model = ic_resnet50(pattern_path=patter)
model.eval()
print(model)
input = torch.randn(1, 3, 224, 224)
y = model(input)
print(y.size())

项目更多精彩内容,详见Github地址:https://github.com/murufeng/awesome_lightweight_networks

推荐阅读

  • 【重磅】斯坦福李飞飞《注意力与Transformer》总结,84页ppt开放下载!

  • MobileViT: 一种更小,更快,高精度的轻量级Transformer端侧网络架构(附代码实现)

  • 【移动端最强架构】LCNet吊打现有主流轻量型网络(附代码实现)

  • 基于Attention机制的轻量级网络架构以及代码实现

  • 深度学习中的轻量级网络架构总结与代码实现

欢迎大家加入DLer-计算机视觉&Transformer群!

大家好,这是计算机视觉&Transformer论文分享群里,群里会第一时间发布最新的Transformer前沿论文解读及交流分享会,主要设计方向有:图像分类、Transformer、目标检测、目标跟踪、点云与语义分割、GAN、超分辨率、视频超分、人脸检测与识别、动作行为与时空运动、模型压缩和量化剪枝、迁移学习、人体姿态估计等内容。

进群请备注:研究方向+学校/公司+昵称(如Transformer+上交+小明)

一文详解Inception家族的前世今生(从InceptionV1-V4、Xception)附全部代码实现相关推荐

  1. java 走马灯程序,详解微信小程序实现跑马灯效果(附完整代码)

    在微信小程序 里实现跑马灯效果,类似滚动字幕或者滚动广告之类的,使用简单的CSS样式控制,没用到JS,效果如下图: Wxml代码: 一个人活着就是为了让更多的人更好的活着! Wxss代码: /*首页跑 ...

  2. 理论+实战,一文详解最常使用的10个聚类算法(附代码)

    聚类或聚类分析是无监督学习问题.它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群.有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法. 相反,最好探索一系列聚类算法 ...

  3. yolov系列-yolov1-论文详解

    yolov系列-yolov1-论文详解 @[TOC](yolov系列-yolov1-论文详解) yolov1相关资料 yolov1论文详解 算法原理 yolov1优缺点 yolov1相关资料 yolo ...

  4. 一文详解JavaBean 看这篇就够了

    一文详解JavaBean 看这篇就够了 JavaBean的历史渊源 JavaBean的定义(通俗版) JavaBean应用 < jsp:useBean > < jsp:getProp ...

  5. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...

  6. 一文详解 YOLO 2 与 YOLO 9000 目标检测系统

    一文详解 YOLO 2 与 YOLO 9000 目标检测系统 from 雷锋网 雷锋网 AI 科技评论按:YOLO 是 Joseph Redmon 和 Ali Farhadi 等人于 2015 年提出 ...

  7. 一文详解决策树算法模型

    AI有道 一个有情怀的公众号 上文我们主要介绍了Adaptive Boosting.AdaBoost演算法通过调整每笔资料的权重,得到不同的hypotheses,然后将不同的hypothesis乘以不 ...

  8. 「软件项目管理」一文详解软件配置管理计划

    一文详解软件配置管理计划 前言 一.配置管理概述 1. 配置管理(SCM)定义 2. 软件配置项目(SCI) 3. 基线 4. 软件配置控制委员会(SCCB) 二.软件配置管理过程 1. 管理过程 2 ...

  9. 「软件项目管理」一文详解软件项目质量计划

    一文详解软件项目质量计划

最新文章

  1. python自学教程读书导图-python机器学习基础教程读书笔记八(全书总结)
  2. sklearn pipeline_Sklearn介绍
  3. 目的港无人提货的法律风险及风险承担
  4. 第十届 蓝桥杯样题 ——代码填空
  5. SQLserver数据库反编译生成Hibernate实体类和映射文件
  6. 冒泡排序与快速排序(java实现)
  7. 如何用python创建文件_如何使用Python创建新的文本文件
  8. PHP去除BOM头的方法
  9. 【安全】java的Jaas授权与鉴权
  10. Libevent源码分析-----开篇
  11. 移动互联网(一)短信和彩信等接口开发封装
  12. 机器学习之线性回归缩减维度
  13. android inflate 参数,Android inflate方法总结
  14. Python+经济学:资本边际效率与IRR
  15. Ubuntu下使用opencv完成图像程序编程操作
  16. GAN原理及Pytorch框架实现GAN(比较容易理解)
  17. 除了编程语言本身,你如果还懂这 7 点,绝对可以在北上深杭拿到 15k
  18. 滴滴网约车抽成高达25%还“入不敷出”,为哪般?
  19. Facebook和Google第三方登录
  20. wechat微信小程序panda我的界面(登录、我的基本信息的修改和保存)

热门文章

  1. kindeditor用法
  2. 用鼠标拖动图片的JS代码
  3. too many levels of symbolic links的错误
  4. 【转】ASP.NET中“字母和数字混合的验证码”详解
  5. php分析图片水印,PHP开发的文字水印,缩略图,图片水印实现类与用法示例
  6. 无人驾驶运动学模型——线性时变模型预测控制的思路推演过程_百叶书的博客-CSDN博客_线性时变模型预测控制 转
  7. TOMCAT为什么打破双亲委派的类加载模型
  8. oracle如何上传图片,js实现上传图片之上传前预览图片
  9. mysql教程日志_mysql日志文件的详细说明
  10. 智源抗疫 - 药物研发小分子性质预测赛