MobileNetV3是由Google在2019年3月21日提出的网络架构,参考arXiv的论文,其中包括两个子版本,即Large和Small。
源码参考:https://github.com/SpikeKing/mobilenet_v3/blob/master/mn3_model.py
重点:
- PyTorch实现MobileNetV3架构;
- h-swish和h-sigmoid的设计;
- 新的MobileNet单元;
- SE结构和Residual结构;
- Last Stage:提前Avg Pooling,和使用1x1卷积;
网络结构:
![c204ab36bfc6ed500f727d337a4c191a.png](https://img-blog.csdnimg.cn/img_convert/c204ab36bfc6ed500f727d337a4c191a.png)
整体架构
MobileNetV3的网络结构可以分为三个部分:
- 起始部分:1个卷积层,通过3x3的卷积,提取特征;
- 中间部分:多个卷积层,不同Large和Small版本,层数和参数不同;
- 最后部分:通过两个1x1的卷积层,代替全连接,输出类别;
网络框架如下,其中参数是Large体系:
![0f158129058464babc260351a881f4bd.png](https://img-blog.csdnimg.cn/img_convert/0f158129058464babc260351a881f4bd.png)
源码如下:
def forward(self, x):
# 起始部分
out = self.init_conv(x)
# 中间部分
out = self.block(out)
# 最后部分
out = self.out_conv1(out)
batch, channels, height, width = out.size()
out = F.avg_pool2d(out, kernel_size=[height, width])
out = self.out_conv2(out)
out = out.view(batch, -1)
return out
起始部分
起始部分,在Large和Small中均相同,也就是结构列表中的第1个卷积层,其中包括3个部分,即卷积层、BN层、h-switch激活层。
![028fa2c386f5c92137df634019eec14e.png](https://img-blog.csdnimg.cn/img_convert/028fa2c386f5c92137df634019eec14e.png)
源码如下:
init_conv_out = _make_divisible(16 * multiplier)
self.init_conv = nn.Sequential(