MobileNetV2 倒置残差和线性瓶颈

本文介绍了MobileNetV2的创新设计,包括倒置残差结构和线性瓶颈,以实现资源受限环境下的高性能计算机视觉任务。这种设计在保持准确率的同时,减少了计算量和内存需求,尤其适合移动设备。实验表明,MobileNetV2在ImageNet分类、目标检测和语义分割等任务上表现出色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客论文地址

介绍

  神经网络在机器智能领域有革命性地作用,比如在图像识别任务中超过了人类的识别准确率。然而,提高准确率的同时带来了新的代价:先进的网络需要的高计算能力超越了许多手机和嵌入式应用计算能力。
  本文介绍了一种新的为移动和资源受限环境特殊定制的神经网络结构。我们的网络在保持相同准确率的情况下通过减少计算量和内存需求,推动了移动定制计算机视觉模型的水平。
  我们主要贡献是一种新的层模块:具有线性瓶颈的倒置残差。这个模块采用了一种低维的压缩表示作为输入,首先扩展成高维然后使用轻量级深度卷积过滤。随后使用线性卷积将特征投影回低维表示。官方实现TensorFlow-Slim提供一部分操作。
  该模块可以在任何现代框架中使用标准操作有效地实现,并允许我们的模型使用标准基准测试在多个性能点上击败最新技术。此外,这种卷积模块特别适用于移动设计,因为它可以通过永远不会完全实现大型中间张量来显着减少推理期间所需的内存占用。这减少了许多嵌入式硬件设计中对主存储器访问的需求,这些设计提供了少量非常快速的软件控制的高速缓冲存储器。

相关工作

  在最近几年,调整深度神经网络的架构以在准确率和性能之间有一个最佳平衡成为一个积极研究的领域。早期的网络如AlexNet,VGGNet,GoogLeNet以及ResNet,这些网络的设计都进行了大量的手工体系结构搜索和训练算法改进。最近在网络架构探索上有了很多进展,比如超参数还有各种网络修剪方法以及连通性学习。大量的工作也致力于内部卷积模块的连接架构的改变,比如ShuffleNet[20]或引入了稀疏性[21]和其它[22]。
  最近,[23, 24, 25, 26]引入了架构探索的新方向,将遗传算法和强化学习加入了其中。然而一个缺点是得到的网络最终会十分复杂。本文的目的是找到然后是神经网络更好地运作并用它指导最简单的网络设计。我们的方法应该被视为[23]描述方法的一种互补和相近的工作。在这种情况下,我们的方法类似于[20,22]所采用的方法并允许进一步改善性能,同时提供内部操作的一部分。我们的网络设计基于MobileNetV1。保留了它的简洁性而且不要求任何特殊操作就能显著提升准确率,实现了移动应用的多图像分类和检测任务的最新技术。

预备、讨论和直觉

### 线性瓶颈倒置残差概念解析 #### 定义与原理 在神经网络架构中,线性瓶颈倒置残差MobileNetV2引入的重要组件。传统残差网络(ResNets)采用宽输入经过一系列变换后再通过窄的路径返回到原始维度;而倒置残差则相反,在较细的层之间设置快捷连接[^1]。 对于线性瓶颈而言,其主要作用是在两个极薄的线性层之间插入一个膨胀后的中间表示形式。具体来说,第一个线性层负责降维操作,第二个用于恢复至初始尺寸。这样的设计有助于维持数据流的有效传播,防止因过度压缩而导致的信息丢失。 #### 设计考量 移除狭窄层次内的非线性激活函数被证实能够提升模型表现力并简化训练过程。这是因为当特征映射变得非常小时,施加ReLU等非线性可能会导致部分通道完全失效,从而影响梯度回传效率以及最终的学习效果。因此,在这些位置保持线性的转换方式显得尤为关键。 #### 实现细节 为了实现上述特性,MobileNetV2采用了特殊的卷积模块——即所谓的“倒置残差块”。该单元首先利用逐点卷积扩大输入张量宽度,接着执行深度可分离卷积完成空间上的特征提取任务,最后再经由另一个逐点卷积缩小输出规模回到起始状态。值得注意的是,只有在这个收缩阶段才会加入跳跃链接以形成完整的残差路径[^2]。 ```python import torch.nn as nn class InvertedResidualBlock(nn.Module): def __init__(self, inp, oup, stride, expand_ratio): super(InvertedResidualBlock, self).__init__() hidden_dim = round(inp * expand_ratio) self.identity = stride == 1 and inp == oup layers = [] if expand_ratio != 1: # pw-linear layers.append(nn.Conv2d(inp, hidden_dim, kernel_size=1)) layers.append(nn.BatchNorm2d(hidden_dim)) layers.append(nn.ReLU6(inplace=True)) layers.extend([ # dw nn.Conv2d(hidden_dim, hidden_dim, groups=hidden_dim, stride=stride), nn.BatchNorm2d(hidden_dim), nn.ReLU6(inplace=True), # pw-linear nn.Conv2d(hidden_dim, oup, kernel_size=1), nn.BatchNorm2d(oup)]) self.conv = nn.Sequential(*layers) def forward(self, x): out = self.conv(x) if self.identity: return x + out else: return out ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值