☰
CoreNet 中的 MobileNetv1:基于深度可分离卷积的轻量级图像分类骨干实战指南
2026/10/2 8:02:43 网站建设 项目流程
  • 深度学习
  • 计算机视觉
  • NLP
  • 多模态
  • 模型训练
  • 大模型

【免费下载链接】corenet

CoreNet: A library for training deep neural networks

项目地址:https://gitcode.com/GitHub_Trending/co/corenet
点击查看免费下载

导读

本文以 CoreNet 仓库中 projects/mobilenet_v1/README.md 为骨架,完整讲解如何在该库中训练与评估 MobileNetv1 图像分类模型:从深度可分离卷积的架构原理、源码级实现(含 layer 配置与通道缩放逻辑),到 ImageNet-1k 上可直接复现的训练/评估命令、完整配置文件逐段解析,以及官方预训练模型与精度对照。读完本文,你将掌握用corenet-train/corenet-eval两个入口快速跑通 MobileNetv1-1.0 全流程,并理解width_multiplier、标签平滑、EMA 等关键配置对模型的影响。

MobileNetv1:用深度可分离卷积换效率

MobileNetv1(原论文 arXiv:1704.04861)的核心思想是用**深度可分离卷积(depthwise separable convolution)**替代标准卷积,将每个卷积分解为两步:

  1. 深度卷积(depthwise conv):每个输入通道独立做一次空间卷积,groups = in_channels,负责提取空间特征;
  2. 逐点卷积(pointwise conv):使用1×1卷积在通道维度上融合信息,负责跨通道组合。

相比标准卷积,这种分解把计算量从K×K×C_in×C_out降为K×K×C_in + C_in×C_out,在精度损失可控的前提下大幅降低 FLOPs 与参数量,因此 MobileNetv1 非常适合移动端与边缘设备。CoreNet 将该骨干作为标准图像分类编码器集成,并配套了 ImageNet 训练配置与预训练权重。

源码实现:从 SeparableConv2d 到完整的 6 段骨干

模型注册与整体结构

在 CoreNet 中,MobileNetv1 被实现为 corenet/modeling/models/classification/mobilenetv1.py 中的MobileNetv1类,通过@MODEL_REGISTRY.register(name="mobilenetv1", type="classification")注册,继承自 base_image_encoder.py 中的BaseImageEncoder。该基类规定了图像编码器的标准结构:conv_1、layer_1~layer_5、conv_1x1_exp(本模型中为Identity()恒等映射)以及分类头classifier,并通过check_model()校验这些模块是否齐全。

前向流程(extract_features)为:

conv_1 -> layer_1 -> layer_2 -> layer_3 -> layer_4 -> layer_5 -> conv_1x1_exp -> classifier

对应特征图空间尺寸依次为 112→112→56→28→14→7,最终经过全局池化(配置中为mean)与全连接分类层输出 logits。

每一层如何构建

骨干通道配置由 corenet/modeling/models/classification/config/mobilenetv1.py 中的get_configuration()决定。该函数读取model.classification.mobilenetv1.width_multiplier(默认 1.0),对每一层的通道数按公式make_divisible(ceil(in_channels × width_mult), 16)缩放,保证通道数是 16 的整数倍以利于硬件加速。原始结构如下:

模块输出通道(width=1.0)striderepeat
conv1322—
layer16411
layer212821
layer325621
layer451225
layer5102421

其中layer4重复 5 次深度可分离卷积块,是整个网络最深的阶段。MobileNetv1._make_layer()会先根据配置插入首块(stride 由配置指定),再按repeat次数堆叠 stride=1 的块,全部使用SeparableConv2d,且每个块都开启归一化与激活(use_norm=True, use_act=True)。

深度可分离卷积的实现细节

SeparableConv2d定义在 corenet/modeling/layers/conv_layer.py 中,其_BaseSeparableConv基类明确展示了分解结构:

  • dw_conv:深度卷积,groups=in_channels,kernel=3,默认不带激活(源码注释明确建议 depthwise 阶段不使用激活函数);
  • pw_conv:1×1逐点卷积,groups=1,带归一化与激活。

forward依次执行x = self.dw_conv(x)、x = self.pw_conv(x)。每一层都是标准的 Conv-Norm-Act 三段式(由ConvLayer2d保证),归一化与激活类型由全局配置model.normalization.name与model.activation.name统一决定,因此在 YAML 中只需声明一次。

分类头与 Dropout

分类头由全局均值池化(GlobalPool(pool_type="mean", keep_dim=False))+ 可选 Dropout +LinearLayer组成。值得注意的源码细节是:若未显式指定model.classification.classifier_dropout,则默认按round(0.1 × width_mult, 3)计算并用bound_fn限制在 [0, 0.1] 区间内——即宽度倍率越大,默认分类头 Dropout 越高。同时在 base_image_encoder.py 中,BaseImageEncoder还支持--model.classification.pretrained、--model.classification.freeze-batch-norm、--model.classification.finetune-pretrained-model等参数,为迁移学习提供便利。

训练:一条命令在 ImageNet 上启动 MobileNetv1-1.0

安装与环境准备

按 README.md 的说明,在 Linux 上推荐 Python 3.10+ 与 PyTorch(>= 2.1.0),克隆仓库后在虚拟环境中执行:

python3 -m venv venv && source venv/bin/activate python3 -m pip install --editable .

安装完成后会生成corenet-train、corenet-eval等命令入口(映射关系见 corenet/cli/entrypoints.py:corenet-train→corenet.cli.main_train:main_worker,corenet-eval→corenet.cli.main_eval:main_worker)。

训练命令

使用单节点 4 张 A100 GPU 训练 MobileNetv1-1.0:

export CFG_FILE=projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml corenet-train --common.config-file $CFG_FILE --common.results-loc classification_results

训练与验证数据需按以下目录布局存放:

/mnt/imagenet/training/ # 训练集(train split) /mnt/imagenet/validation/ # 验证集(val split)

注意:--common.results-loc classification_results指定了实验输出目录(checkpoint、日志等都会写到这里),配置中的common.auto_resume: true会让训练在中断后自动从最近的 checkpoint 恢复。

训练配置逐段解析

完整的官方配置位于 projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml,以下逐段说明其作用与要点:

common(通用训练控制)

common: run_label: "train" log_freq: 500 auto_resume: true mixed_precision: true channels_last: true
  • mixed_precision:开启混合精度训练,配合 4×A100 可显著提速并降低显存;
  • channels_last:使用 NHWC 内存布局,在支持该布局的硬件上获得更好的卷积性能;
  • log_freq: 500:每 500 个 iteration 打印一次训练日志。

dataset(数据集与 DataLoader)

dataset: root_train: "/mnt/imagenet/training" root_val: "/mnt/imagenet/validation" name: "imagenet" category: "classification" train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs) val_batch_size0: 100 eval_batch_size0: 100 workers: 8 persistent_workers: true pin_memory: true collate_fn_name_train: "image_classification_data_collate_fn" collate_fn_name_val: "image_classification_data_collate_fn" collate_fn_name_test: "image_classification_data_collate_fn"
  • train_batch_size0: 128是单卡batch size,注释明确指出有效 batch size = 128 × 4 GPUs = 512;
  • 验证与评估阶段单卡 batch size 为 100;
  • persistent_workers: true+pin_memory: true用于减少数据加载抖动;
  • collate 函数统一使用分类任务专用的image_classification_data_collate_fn。

image_augmentation(训练数据增强流水线)

image_augmentation: random_resized_crop: enable: true interpolation: "bilinear" random_horizontal_flip: enable: true resize: enable: true size: 256 # shorter size is 256 interpolation: "bilinear" center_crop: enable: true size: 224

训练阶段采用随机裁剪缩放 + 随机水平翻转的经典组合;评估阶段将图像短边缩放到 256 再中心裁剪为 224×224(与模型默认输入分辨率一致)。

sampler(可变 batch 采样器)

sampler: name: "variable_batch_sampler" vbs: crop_size_width: 224 crop_size_height: 224 max_n_scales: 5 min_crop_size_width: 128 max_crop_size_width: 320 min_crop_size_height: 128 max_crop_size_height: 320 check_scale: 32

variable_batch_sampler会在训练过程中随机切换输入分辨率(宽度/高度在 128~320 之间、步长 32 对齐、最多 5 档),相当于一种廉价的尺度数据增强,有助于提升模型的尺度鲁棒性。

loss(损失函数)

loss: category: "classification" classification: name: "cross_entropy" cross_entropy: label_smoothing: 0.1

使用带 0.1 标签平滑的交叉熵损失。在 corenet/loss_fn/classification/cross_entropy.py 中,label_smoothing从loss.classification.cross_entropy.label_smoothing读取,且仅在训练阶段生效(验证时强制为 0.0),保证评测指标不受平滑影响。

optim(优化器)

optim: name: "sgd" weight_decay: 4.e-5 no_decay_bn_filter_bias: true sgd: momentum: 0.9 nesterov: true

SGD + 动量 0.9 + Nesterov 加速,权重衰减 4e-5;no_decay_bn_filter_bias: true表示 BatchNorm 参数与偏置不参与权重衰减。

scheduler(学习率调度)

scheduler: name: "cosine" is_iteration_based: false max_epochs: 300 warmup_iterations: 7500 warmup_init_lr: 0.05 cosine: max_lr: 0.4 min_lr: 2.e-4

余弦退火调度,共训练 300 个 epoch:学习率从预热初值 0.05 经过 7500 个 iteration 的 warmup 升至 0.4,再沿余弦曲线衰减至 2e-4。

model(模型结构)

model: classification: name: "mobilenetv1" n_classes: 1000 activation: name: "relu" mobilenetv1: width_multiplier: 1.0 normalization: name: "batch_norm" momentum: 0.1 activation: name: "relu" inplace: false layer: global_pool: "mean" conv_init: "kaiming_normal" linear_init: "normal"
  • model.classification.name: "mobilenetv1"与注册表对应,width_multiplier: 1.0即 MobileNetv1-1.0;改为 0.25/0.5/0.75 即得到下表对应的小模型;
  • 归一化统一为 momentum=0.1 的 BatchNorm,激活为 ReLU;
  • 初始化策略:卷积层 Kaiming Normal,全连接层 Normal;全局池化为均值池化。

ema(指数移动平均)

ema: enable: true momentum: 0.0005

开启权重 EMA,衰减系数 0.0005,用于平滑训练过程中的权重抖动,通常能带来更稳定的验证精度。

stats(指标与 checkpoint 依据)

stats: val: [ "loss", "top1", "top5" ] train: ["loss"] checkpoint_metric: "top1" checkpoint_metric_max: true

验证阶段跟踪 loss、top-1、top-5 三个指标;并以 top-1 为 checkpoint 择优指标(越大越好),即自动保留验证集 top-1 最高的模型。

评估:加载预训练权重复现 74.04% Top-1

评估命令

export CFG_FILE=projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml export DATASET_PATH="/mnt/vision_datasets/imagenet/validation/" # change to the ImageNet validation path export MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.pt CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH

要点说明:

  • --model.classification.pretrained对应 base_image_encoder.py 中定义的参数,用于加载预训练权重(替换为你本地下载的.pt路径亦可);
  • --common.override-kwargs dataset.root_val=$DATASET_PATH通过命令行覆盖验证集路径,无需修改 YAML;
  • CUDA_VISIBLE_DEVICES=0指定单卡执行评估。

预期结果

按官方配置评估 MobileNetv1-1.0 在 ImageNet 验证集上应复现:

top1=74.044 || top5=91.578

预训练模型一览(ImageNet-1k)

官方提供了 4 个不同宽度倍率的预训练模型,可直接用上述corenet-eval流程加载对应权重:

ModelParametersTop-1权重配套 ConfigLogs
MobileNetv1-0.250.5 M54.45mobilenetv1-0.25.ptmobilenetv1-0.25.yamlmobilenetv1-0.25.logs
MobileNetv1-0.51.3 M65.93mobilenetv1-0.5.ptmobilenetv1-0.5.yamlmobilenetv1-0.5.logs
MobileNetv1-0.752.6 M71.44mobilenetv1-0.75.ptmobilenetv1-0.75.yamlmobilenetv1-0.75.logs
MobileNetv1-1.004.2 M74.04mobilenetv1-1.00.ptmobilenetv1-1.00.yamlmobilenetv1-1.00.logs

(权重、配套配置与训练日志均托管在官方 ml-research 模型资产目录下,与上文评估命令中的MODEL_WEIGHTS地址同源。)

从中可以清晰看到宽度倍率与精度的权衡:参数从 0.5M 增至 4.2M(约 8 倍),Top-1 从 54.45% 提升到 74.04%。实际部署时可按目标设备算力选择倍率,并把 YAML 中model.classification.mobilenetv1.width_multiplier改为对应值即可复现。

小结:从配置到复现的关键路径

  • 结构核心:深度可分离卷积(深度卷积 + 1×1 逐点卷积),源码见 corenet/modeling/layers/conv_layer.py,6 段骨干定义见 corenet/modeling/models/classification/mobilenetv1.py;
  • 通道缩放:由width_multiplier统一控制,见 corenet/modeling/models/classification/config/mobilenetv1.py;
  • 训练:corenet-train --common.config-file <yaml> --common.results-loc <dir>;
  • 评估:corenet-eval+--model.classification.pretrained加载官方权重,预期 top1=74.044 / top5=91.578;
  • 配置要点:有效 batch size = 单卡 128 × 4 卡 = 512,300 epoch 余弦退火 + 0.1 标签平滑 + SGD(Nesterov),并以验证 top-1 为 checkpoint 择优依据。

引用

如果本文档与相关代码对你的工作有帮助,请引用原论文与 CVNets 库:

@article{Howard2017MobileNetsEC, title={MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications}, author={Andrew G. Howard and Menglong Zhu and Bo Chen and Dmitry Kalenichenko and Weijun Wang and Tobias Weyand and Marco Andreetto and Hartwig Adam}, journal={ArXiv}, year={2017}, volume={abs/1704.04861} } @inproceedings{mehta2022cvnets, author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, title = {CVNets: High Performance Library for Computer Vision}, year = {2022}, booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, series = {MM '22} }
  • 深度学习
  • 计算机视觉
  • NLP
  • 多模态
  • 模型训练
  • 大模型

【免费下载链接】corenet

CoreNet: A library for training deep neural networks

项目地址:https://gitcode.com/GitHub_Trending/co/corenet
点击查看免费下载

相关推荐

上一篇:Win11DisableRoundedCorners与其他窗口定制工具对比:哪个最适合你的需求
下一篇:petals安全评估工具:量化分布式系统的安全等级

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询