- 深度学习
- 计算机视觉
- NLP
- 多模态
- 模型训练
- 大模型
【免费下载链接】corenet
CoreNet: A library for training deep neural networks
导读
本文以 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)**替代标准卷积,将每个卷积分解为两步:
- 深度卷积(depthwise conv):每个输入通道独立做一次空间卷积,
groups = in_channels,负责提取空间特征; - 逐点卷积(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) | stride | repeat |
|---|---|---|---|
| conv1 | 32 | 2 | — |
| layer1 | 64 | 1 | 1 |
| layer2 | 128 | 2 | 1 |
| layer3 | 256 | 2 | 1 |
| layer4 | 512 | 2 | 5 |
| layer5 | 1024 | 2 | 1 |
其中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: truemixed_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: 32variable_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: trueSGD + 动量 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流程加载对应权重:
| Model | Parameters | Top-1 | 权重 | 配套 Config | Logs |
|---|---|---|---|---|---|
| MobileNetv1-0.25 | 0.5 M | 54.45 | mobilenetv1-0.25.pt | mobilenetv1-0.25.yaml | mobilenetv1-0.25.logs |
| MobileNetv1-0.5 | 1.3 M | 65.93 | mobilenetv1-0.5.pt | mobilenetv1-0.5.yaml | mobilenetv1-0.5.logs |
| MobileNetv1-0.75 | 2.6 M | 71.44 | mobilenetv1-0.75.pt | mobilenetv1-0.75.yaml | mobilenetv1-0.75.logs |
| MobileNetv1-1.00 | 4.2 M | 74.04 | mobilenetv1-1.00.pt | mobilenetv1-1.00.yaml | mobilenetv1-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
相关推荐
如何掌握深度可分离卷积:从ResNet到MobileNetV1的终极指南
如何掌握深度可分离卷积:从ResNet到MobileNetV1的终极指南 在计算机视觉领域,卷积神经网络(CNN)的发展极大推动了图像识别技术的进步。而 深度可
人工智能计算机视觉深度学习预训练Hello-Agents 从零开始构建智能体:Datawhale 开源 AI Agent 系统性学习路线全解析
Hello Agents 从零开始构建智能体:Datawhale 开源 AI Agent 系统性学习路线全解析 导读 :本文以 Datawhale 开源教程 H
教程人工智能大模型AI AgentLaMa图像修复中的深度可分离卷积:轻量化实现与性能优化指南
LaMa图像修复中的深度可分离卷积:轻量化实现与性能优化指南 LaMa(Large Mask Inpainting)是一个基于傅里叶卷积的图像修复项目,它在大尺
人工智能计算机视觉深度学习图像处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考