先看一下V3的网络结构,V3版本有两个,一个是Large 和 Small,分别适用于不同的场景。网路结构如下:
上表为具体的参数设置,其中bneck是网络的基本结构。SE代表是否使用通道注意力机制。NL代表激活函数的类型,包括HS(h-swish),RE(ReLU)。NBN 代表没有BN操作。s 是stride的意思,网络使用卷积stride操作进行降采样,没有使用pooling操作。
MobileNetV3 的特点:
-
继承V1的深度可分离卷积和V2的具有线性瓶颈的残差结构。
-
使用NetAdapt算法获得卷积核和通道的最佳数量。
-
使用了一种新的激活函数h-swish(x)代替Relu6,其公式:xRelu6(x + 3)/6。
-
引入SE通道注意力结构,使用了Relu6(x + 3)/6来近似SE模块中的sigmoid。
-
模型分为Large和Small,在ImageNet 分类任务中和V2相比,Large正确率上升了 3.2%,计算延时还降低了 20%。
MobileNetV3代码实现(pytorch):
https://wanghao.blog.csdn.net/article/details/121607296
===========================================================================
为了提高成绩我在代码中加入Cutout和Mixup这两种增强方式。实现这两种增强需要安装torchtoolbox。安装命令:
pip install torchtoolbox
Cutout实现,在transforms中。
from torchtoolbox.transform import Cutout
数据预处理
transform = transforms.Compose([
transforms.Resize((224, 224)),
Cutout(),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])
Mixup实现,在train方法中。需要导入包:from torchtoolbox.tools import mixup_data, mixup_criterion
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device, non_blocking=True), target.to(device, non_blocking=True)
data, labels_a, labels_b, lam = mixup_data(data, target, alpha)
optimizer.zero_grad()
output = model(data)
loss = mixup_criterion(criterion, output, labels_a, labels_b, lam)
loss.backward()
optimizer.ste