mobilenetv3结构
时间: 2025-01-04 16:34:10 浏览: 14
### MobilenetV3 网络架构详解
#### 一、概述
MobileNetV3 是 MobileNet 家族中的第三代模型,在继承前两代优点的基础上进行了改进,旨在提高效率的同时提升精度。该版本引入了神经架构搜索(NAS),用于优化网络结构并找到更高效的组件组合[^1]。
#### 二、主要特性
- **Squeeze-and-Excitation (SE) 模块**:为了增强特征表示的能力,部分层加入了 SE 结构,这有助于自适应调整通道权重,使得重要信息得到加强而冗余数据被抑制。
- **Hard Swish 和 Hard Sigmoid 非线性激活函数**:相较于传统的 ReLU 函数,这两种新提出的激活方式不仅能够减少计算成本,而且可以更好地保留负数区域的信息,防止梯度消失现象的发生。
- **深度可分离卷积**:延续了 MobileNet 的核心设计理念——利用深度可分离卷积代替标准卷积操作,大幅降低了参数量与运算复杂度。具体来说就是先执行逐通道的空间卷积再做逐点的跨通道融合[^2]。
#### 三、模块化设计
MobileNetV3 主要由多个基本单元构成,每个单元内部遵循“膨胀 - 卷积 - 投影”的模式:
1. **膨胀阶段**:通过 $1\times1$ 卷积增加输入张量的维度;
2. **空间卷积阶段**:采用 $3\times3$ 或者其他尺寸的深度wise卷积处理局部纹理;
3. **投影阶段**:再次运用 $1\times1$ 卷积降低输出张量的宽度至原始水平,并可能附加有无跳跃连接的选择项以及是否启用 SE 层等配置选项[^3]。
```python
import torch.nn as nn
class MBConv(nn.Module):
def __init__(self, inp, oup, stride, expand_ratio, use_se=True, activation=nn.Hardswish):
super(MBConv, self).__init__()
hidden_dim = round(inp * expand_ratio)
layers = []
if expand_ratio != 1:
# pw
layers.append(nn.Conv2d(inp, hidden_dim, kernel_size=1))
layers.append(activation(inplace=True))
layers.extend([
# dw
nn.Conv2d(hidden_dim, hidden_dim, groups=hidden_dim,
stride=stride),
nn.BatchNorm2d(hidden_dim),
# se
SELayer(hidden_dim) if use_se else nn.Identity(),
# pw-linear
nn.Conv2d(hidden_dim, oup, kernel_size=1),
nn.BatchNorm2d(oup)])
self.conv = nn.Sequential(*layers)
def forward(self,x):
return x + self.conv(x) if isinstance(self.residual_connection, nn.Identity) else self.conv(x)
```
阅读全文