【导读】今天将主要介绍Inception的家族及其前世今生.Inception 网络是 CNN 发展史上一个重要的里程碑。在 Inception 出现之前,大部分 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。而Inception则是从网络的堆叠结构出发,提出了多条并行分支结构的思想,后续一系列的多分支网络结构均从此而来。总体来说,Inception系列网络在结构上相对比较复杂,工程性较强,而且其中通常使用很多tricks来提升网络的综合性能(准确率和速度)。目前Inception系列具体网络结构包括:
详细代码可查看:https://github.com/murufeng/awesome_lightweight_networks/tree/main/light_cnns/Inception
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())
- 论文地址:https://arxiv.org/abs/1512.00567
Inception v2 和 Inception v3 均来自同一篇论文《Rethinking the Inception Architecture for Computer Vision》,作者提出了一系列能增加准确度和减少计算复杂度的修正方法。
Inceptionv2针对InceptionV1改进的点主要有:
网络结构如下所示:
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点改进:
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主要的motivation则是 Inception 架构和残差连接结合起来会是什么效果?如何有效地结合残差连接来显著加速 Inception 的训练? 下面主要介绍一下Inception v4是如何来解决上述问题的。Inception v4主要提出了以下几种改进:
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())
基于Inception的模块,一个新的架构Xception应运而生。Xception取义自Extreme Inception,即Xception是一种极端的Inception.它的提出主要是为了解耦通道相关性和空间相关性。由于Inception模块首先使用1*1的卷积核将特征图的各个通道映射到一个新的空间,在这一过程中学习通道间的相关性;再通过常规的3*3或5*5的卷积核进行卷积,以同时学习空间上的相关性和通道间的相关性。但此时,通道间的相关性和空间相关性仍旧没有完全分离。而Xception通过提出深度可分离卷积则成功实现了将学习空间相关性和学习通道间相关性的任务完全分离,具体操作如下:
网络结构如下所示:
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())
为了充分挖掘空洞卷积的潜力,本文主要结合一种基于统计优化的简单而高效(零成本)的空洞搜索算法(EDO,effective dilation search)提出了一种新的空洞卷积变体,即inception (dilated)卷积.具体做法如下:
网络结构如下:
代码实现:
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())