From Inception to Xception

首先介绍1x1卷积核的作用,其次分别引出Inception及Xception的思想

1x1卷积核的作用

1.实现跨通道信息的整合或拆分

首先看一下2x2的卷积核

输入:4x4x3 卷积核:2x2x3x1 输出:3x3x1
2X2的卷积核将图中的12个输入节点组合映射到1个输出节点上。
3_in_1_out

接着看1x1的卷积核

输入:4x4x3 卷积核:1x1x3x2 输出:4x4x2
1x1的卷积核将下面左图中的3个输入节点组合映射到2个输出节点上。
这里写图片描述

输入:4x4x3 卷积核:1x1x3x4 输出:4x4x4
1x1的卷积核将上面右图中的3个输入节点组合映射到4个输出节点上。

因此,1*1的卷积就是对每个像素点,将多个channels的feature maps线性组合(实现跨通道信息的整合或拆分),当输出channels小于输入channels,即实现了降维(信息整合)。反之则是升维(信息拆分)。

2.大大减少参数数量

Inception
上图为Inception模型中,采用1x1卷积核前后的网络结构。
假设输入的feature map是28×28×192,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是不变的(192),再加卷积层得到的feature map(64+128+32),会使输出的feature map扩大到192+64+128+32=416,如果每个模块都这样,网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了64+128+32+32=256。

再来看一个ResNet中利用1x1卷积核减少参数数量的例子

这里写图片描述

在训练浅层网络时,我们选用前面这种结构,而如果网络较深(大于50层)时,会考虑使用后面这种(bottleneck),原因主要在减少网络参数。

对于ImageNet而言,进入到第一个residual block的input为 (56,56,64)
采用左侧的两个 3x3的卷积层:
参数量为 :3x3x64x64 + 3x3x64x64 = 73728

采用右侧的bottleneck:
参数量为: 1x1x64x64 + 3x3x64x64 +1x1x256x64 = 57344

Inception

对每个像素点,提取多个 channels的信息并将其压缩到更低的维度。不考虑像素与像素之间的信息整合。

Xception

Xception认为:跨通道的相关性和空间相关性是完全可分离的,最好不要联合映射它们。
它首先对多个feature maps在各自的通道上进行空间上的信息整合,然后采用1x1的卷积核对每个像素点进行跨通道的信息整合。

Xception

借此分离了跨通道的相关性和空间相关性。

在 ImageNet 数据集上,Xception 的表现稍稍优于 Inception v3,而且在一个有 17000 类的更大规模的图像分类数据集上的表现更是好得多。最重要的是,它的模型参数的数量和 Inception 一样多,说明它的计算效率也更高。

参考网址:
https://zhuanlan.zhihu.com/p/27642620
http://www.caffecn.cn/?/question/136

### InceptionV3 模型简介 InceptionV3 是 Google 提出的一种改进版的深度卷积神经网络架构,它基于早期版本的 Inception 架构进行了优化和扩展。相比于之前的版本(如 Inception V1 和 V2),InceptionV3 更加高效并具有更高的准确性。 #### 主要特点 - **分解卷积操作**:InceptionV3 将传统的 $n \times n$ 卷积分解为两个更小的卷积核组合,例如将 $3 \times 3$ 的卷积分解成连续两次的 $1 \times 3$ 和 $3 \times 1$ 的卷积[^5]。这种设计减少了计算量的同时保持了感受野不变。 - **辅助分类器**:为了缓解梯度消失问题,在网络的不同层次引入了多个辅助分类器,这些分类器不仅有助于加速收敛还提高了最终预测性能。 - **Batch Normalization (BN)** 层的应用:通过标准化每一层激活值来减少内部协变量偏移现象的发生频率以及严重程度,从而加快训练速度并且允许使用更大的学习率而不会导致发散情况发生。 - **全局平均池化替代全连接层**:在最后几层采用 Global Average Pooling 来代替传统意义上的密集连接层完成降维任务,这样做的好处是可以有效防止过拟合问题出现,并且简化整个模型结构使其更加轻便易移植到其他平台上去部署应用。 以下是构建一个简单的 InceptionV3 训练流程的例子: ```python import tensorflow as tf from tensorflow.keras.applications import InceptionV3 from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.models import Model # 定义基础模型 base_model = InceptionV3(weights='imagenet', include_top=False) # 添加自定义顶层 x = base_model.output x = Flatten()(x) predictions = Dense(1000, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 执行训练过程 train_data_gen = ... # 初始化数据生成器 validation_data_gen = ... history = model.fit(train_data_gen, epochs=10, validation_data=validation_data_gen) ``` 上述代码展示了如何加载预训练权重、修改顶部结构以适应特定的任务需求,并编译好之后开始实际训练的过程[^1]。 ### 转换至 TensorFlow Lite 并验证其效果 当希望把已经训练完毕的大规模深度学习框架下的模型迁移到移动端设备或者其他资源受限环境中去运行时,则可以考虑将其转化为TensorFlowLite格式。下面给出一段关于怎样利用TFLite-relay工具链来做这件事的具体方法说明: ```python import tvm.relay as relay import numpy as np tflite_model_buf = open("inception_v3.tflite", "rb").read() try: import tflite.Model except ImportError: raise Exception("need to install the package `tflite`") tflite_model = tflite.Model.GetRootAsModel(tflite_model_buf, 0) data_shape = {'input': (1, 299, 299, 3)} dtype_dict = {'input': 'float32'} mod, params = relay.frontend.from_tflite( tflite_model, shape_dict=data_shape, dtype_dict=dtype_dict ) print(mod) # 可视化查看relay模块内的QNN算子分布状况 ``` 此脚本读取了一个名为"inception_v3.tflite"的小型文件表示形式的模型实例对象;接着调用了相应接口函数完成了从原始状态向目标表达方式之间的转变工作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值