Xception

1、网络结构(CVPR2017)

  如果说ResNeXt是ResNet的增强版,那毫无疑问,Xception就是Inception家族的增强版,为什么?因为牛X呀。这篇文章深入分析了Inception的卷积,在Inception模块中,从跨通道的关系看,先是由一系列1*1的卷积把输入映射为3到4个分离的比原始空间小的特征图,然后从跨空间的角度看,再用3*3或者5*5的卷积对这些小的特征图进行映射(如下左图)。Inception之后的一个假设是跨通道的关系和跨空间的关系可以被充分地解耦合,这比起同时映射跨通道和跨空间而言更可取。那么问题来了,1*1的卷积映射为多少个小的特征图比较好呢?极端的情况下(如下右图),就是先用1*1的卷积映射跨通道的关系,然后每个通道进行独立地空间关系的映射。

                          

    极端情况的Inception和深度可分离卷积非常相似了,深度可分离卷积先是对每个通道独立进行跨空间的卷积,然后接着是跨通道的卷积(通常是一个1*1的卷积)来映射跨通道的关系。极端情况的Inception模块深度可分离卷积的区别如下1)顺序不一样,深度可分离卷积是逐通道跨空间卷积,然后才是1*1的跨通道卷积,而Inception极端情况恰好相反;2)Inception的极端情况中两种卷积之后都有激活函数ReLU,而深度可分离卷积逐通道跨空间卷积之后没有激活函数ReLU。总结来说,极端情况的Inception模块的形式为: Conv(1*1) + BN + ReLU + Depthconv(3*3) + BN + ReLU;深度可分离卷积的形式为:Depthconv(3*3) + BN + Conv(1*1) + BN + ReLU。

  下图是标准卷积和深度可分离卷积的区别:

                                      

      这篇论文在Inception v3的基础上,把Inception模块替换为深度可分离卷积,然后结合ResNet的跳跃连接,提出了Xception,整体网络结构如下:

    

    整个网络由36个卷积层组成,这36个卷积层分为14个模块,除了第一个和最后一个模块外,每个模块都有一个线性的跳跃连接,这使得网络结构非常容易定义和修改。

2、实验结果

         

   可以看出,Xception比Inception v3的效果更好,但是参数比Inception v3更少,这证明了Xception的有效性。此外,论文中还做了一个实验,那就是在深度可分离卷积的中间层,即逐通道的卷积之后加上激活函数ReLU,结果证明加上后效果会更差:

                                        

3、参考

Xception官方源码:https://github.com/tensorflow/models/blob/master/research/deeplab/core/xception.py

Xception预训练模型:https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md  

论文:《Xception: Deep Learning with Depthwise Separable Convolutions》

Xception在PyTorch中有相应的实现和使用方法。 ### 使用方法 在使用Xception模型前,需要进行环境配置。要确保安装了Anaconda和Python 3.6,然后克隆项目仓库: ```bash git clone https://github.com/jfzhang95/pytorch-deeplab-xception.git cd pytorch-deeplab-xception ``` 此项目是基于PyTorch框架实现的DeepLab v3+模型,支持使用Modified Aligned Xception作为骨干网络,可以用于训练Pascal VOC、SBD、Cityscapes和COCO等数据集 [^2][^5]。 ### 代码实现 以下是Xception在PyTorch中的代码实现示例: ```python from torch import nn from torch.nn import Conv2d, BatchNorm2d class Xception(nn.Module): def __init__(self, inp, oup): super(Xception, self).__init__() # depthwise self.conv1 = Conv2d(inp, inp, kernel_size=(3, 3), stride=(1, 1), padding=1, groups=inp) self.bn1 = BatchNorm2d(inp) # 输入为上一层输出的通道数 # pointwise self.conv2 = Conv2d(inp, oup, (1, 1)) # Stride of the convolution. Default: 1 self.bn2 = BatchNorm2d(oup) self.relu = nn.ReLU() def forward(self, input): output = self.conv1(input) output = self.bn1(output) output = self.relu(output) output = self.conv2(output) output = self.bn2(output) output = self.relu(output) return output ``` 以上代码定义了一个Xception模块,包括深度可分离卷积(depthwise)和逐点卷积(pointwise),并在`forward`方法中定义了前向传播过程 [^4]。 ### 相关资料 可以参考的相关资料有关于PyTorch - DeepLab - Xception的内容,该项目是一个基于PyTorch框架实现的DeepLab v3+模型,支持使用Modified Aligned Xception作为骨干网络,能用于训练多个数据集,其主要编程语言是Python,依赖于PyTorch框架 [^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值