MMPretrain代码课

一,安装MMPretrain

从源码安装

这种情况下,从源码按如下方式安装 mmpretrain:

git clone https://github.com/open-mmlab/mmpretrain.git
cd mmpretrain
pip install -U openmim && mim install -e .

"-e" 表示以可编辑形式安装,这样可以在不重新安装的情况下,让本地修改直接生效

作为 Python 包安装

直接使用 mim 安装即可。

pip install -U openmim && mim install "mmpretrain>=1.0.0rc8"

安装多模态支持 (可选)

MMPretrain 中的多模态模型需要额外的依赖项,要安装这些依赖项,请在安装过程中添加 [multimodal] 参数,如下所示:

# 从源码安装
mim install -e ".[multimodal]"

# 作为 Python 包安装
mim install "mmpretrain[multimodal]>=1.0.0rc8"

验证安装

为了验证 MMPretrain 的安装是否正确,我们提供了一些示例代码来执行模型推理。

如果你是从源码安装的 mmpretrain,那么直接运行以下命令进行验证:

python demo/image_demo.py demo/demo.JPEG resnet18_8xb32_in1k --device cpu

你可以看到命令行中输出了结果字典,包括 pred_labelpred_score 和 pred_class 三个字段。

如果你是作为 Python 包安装,那么可以打开你的 Python 解释器,并粘贴如下代码:

from mmpretrain import get_model, inference_model

model = get_model('resnet18_8xb32_in1k', device='cpu')  # 或者 device='cuda:0'
inference_model(model, 'demo/demo.JPEG')

二、配置文件学习

模型配置

模型原始配置文件包含一个 model 字典数据结构,主要包括网络结构、损失函数等信息:

  • type:算法类型,我们支持了多种任务

  • 对于图像分类任务,通常为 ImageClassifier,更多细节请参考 API 文档

  • 对于自监督任务,有多种类型的算法,例如 MoCoV2BEiTMAE 等。更多细节请参考 API 文档

  • 对于图像检索任务,通常为 ImageToImageRetriever,更多细节请参考 API 文档.

        通常,我们使用 type字段 来指定组件的类,并使用其他字段来传递类的初始化参数。注册器教程 对其进行了详细描述。

这里我们以 ImageClassifier 的配置字段为例,对初始化参数进行说明:

  • backbone: 主干网络设置,主干网络为主要的特征提取网络,比如 ResNetSwin TransformerVision Transformer 等等。更多可用选项请参考 API 文档

    • 对于自监督学习,有些主干网络需要重新实现,您可以在 API 文档 中获取更多细节。

  • neck: 颈网络设置,颈网络主要是连接主干网和头网络的中间部分,比如 GlobalAveragePooling 等,更多可用选项请参考 API 文档

  • head: 头网络设置,头网络主要是与具体任务关联的部件,如图像分类、自监督训练等,更多可用选项请参考 API 文档

    • loss: 损失函数设置, 支持 CrossEntropyLossLabelSmoothLossPixelReconstructionLoss 等,更多可用选项参考 API 文档

  • data_preprocessor: 图像输入的预处理模块,输入在进入模型前的预处理操作,例如 ClsDataPreprocessor, 有关详细信息,请参阅 API 文档

  • train_cfgImageClassifier 的额外训练配置。在 ImageClassifier 中,我们使用这一参数指定批数据增强设置,比如 Mixup 和 CutMix。详见文档

model = dict(
    type='ImageClassifier',     # 主模型类型(对于图像分类任务,使用 `ImageClassifier`)
    backbone=dict(
        type='ResNet',          # 主干网络类型
        # 除了 `type` 之外的所有字段都来自 `ResNet` 类的 __init__ 方法
        # 可查阅 https://mmpretrain.readthedocs.io/zh_CN/latest/api/generated/mmpretrain.models.backbones.ResNet.html
        depth=50,
        num_stages=4,           # 主干网络状态(stages)的数目,这些状态产生的特征图作为后续的 head 的输入。
        out_indices=(3, ),      # 输出的特征图输出索引。
        frozen_stages=-1,       # 冻结主干网的层数
        style='pytorch'),
    neck=dict(type='GlobalAveragePooling'),    # 颈网络类型
    head=dict(
        type='LinearClsHead',         # 分类颈网络类型
        # 除了 `type` 之外的所有字段都来自 `LinearClsHead` 类的 __init__ 方法
        # 可查阅 https://mmpretrain.readthedocs.io/zh_CN/latest/api/generated/mmpretrain.models.heads.LinearClsHead.html
        num_classes=1000,
        in_channels=2048,
        loss=dict(type='CrossEntropyLoss', loss_weight=1.0), # 损失函数配置信息
        topk=(1, 5),                 # 评估指标,Top-k 准确率, 这里为 top1 与 top5 准确率
    ))

数据

数据原始配置文件主要包括预处理设置、dataloader 以及 评估器等设置:

  • data_preprocessor: 模型输入预处理配置,与 model.data_preprocessor 相同,但优先级更低。

  • train_evaluator | val_evaluator | test_evaluator: 构建评估器,参考 API 文档

  • train_dataloader | val_dataloader | test_dataloader: 构建 dataloader

    • samples_per_gpu: 每个 GPU 的 batch size

    • workers_per_gpu: 每个 GPU 的线程数

    • sampler: 采样器配置

    • dataset: 数据集配置

dataset_type = 'ImageNet'
# 预处理配置
data_preprocessor = dict(
    # 输入的图片数据通道以 'RGB' 顺序
    mean=[123.675, 116.28, 103.53],    # 输入图像归一化的 RGB 通道均值
    std=[58.395, 57.12, 57.375],       # 输入图像归一化的 RGB 通道标准差
    to_rgb=True,                       # 是否将通道翻转,从 BGR 转为 RGB 或者 RGB 转为 BGR
)

train_pipeline = [
    dict(type='LoadImageFromFile'),     # 读取图像
    dict(type='RandomResizedCrop', scale=224),     # 随机放缩裁剪
    dict(type='RandomFlip', prob=0.5, direction='horizontal'),   # 随机水平翻转
    dict(type='PackInputs'),         # 准备图像以及标签
]

test_pipeline = [
    dict(type='LoadImageFromFile'),     # 读取图像
    dict(type='ResizeEdge', scale=256, edge='short'),  # 缩放短边尺寸至 256px
    dict(type='CenterCrop', crop_size=224),     # 中心裁剪
    dict(type='PackInputs'),                 # 准备图像以及标签
]

# 构造训练集 dataloader
train_dataloader = dict(
    batch_size=32,                     # 每张 GPU 的 batchsize
    num_workers=5,                     # 每个 GPU 的线程数
    dataset=dict(                      # 训练数据集
        type=dataset_type,
        data_root='data/imagenet',
        ann_file='meta/train.txt',
        data_prefix='train',
        pipeline=train_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=True),   # 默认采样器
    persistent_workers=True,                             # 是否保持进程,可以缩短每个 epoch 的准备时间
)

# 构造验证集 dataloader
val_dataloader = dict(
    batch_size=32,
    num_workers=5,
    dataset=dict(
        type=dataset_type,
        data_root='data/imagenet',
        ann_file='meta/val.txt',
        data_prefix='val',
        pipeline=test_pipeline),
    sampler=dict(type='DefaultSampler', shuffle=False),
    persistent_workers=True,
)
# 验证集评估设置,使用准确率为指标, 这里使用 topk1 以及 top5 准确率
val_evaluator = dict(type='Accuracy', topk=(1, 5))

test_dataloader = val_dataloader  # test dataloader 配置,这里直接与 val_dataloader 相同
test_evaluator = val_evaluator    # 测试集的评估配置,这里直接与 val_evaluator 相同

训练策略

训练策略原始配置文件主要包括预优化器设置和训练、验证及测试的循环控制器(LOOP):

  • optim_wrapper: 优化器装饰器配置信息,我们使用优化器装饰配置优化进程。

    • optimizer: 支持 pytorch 所有的优化器,参考相关 MMEngine 文档。

    • paramwise_cfg: 根据参数的类型或名称设置不同的优化参数,参考相关 学习策略文档 文档。

    • accumulative_counts: 积累几个反向传播后再优化参数,你可以用它通过小批量来模拟大批量。

  • param_scheduler : 学习率策略,你可以指定训练期间的学习率和动量曲线。有关详细信息,请参阅 MMEngine 中的 文档

  • train_cfg | val_cfg | test_cfg: 训练、验证以及测试的循环执行器配置,请参考相关的MMEngine 文档

optim_wrapper = dict(
    # 使用 SGD 优化器来优化参数
    optimizer=dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.0001))

# 学习率参数的调整策略
# 'MultiStepLR' 表示使用多步策略来调度学习率(LR)。
param_scheduler = dict(
    type='MultiStepLR', by_epoch=True, milestones=[30, 60, 90], gamma=0.1)

# 训练的配置,迭代 100 个 epoch,每一个训练 epoch 后都做验证集评估
# 'by_epoch=True' 默认使用 `EpochBaseLoop`,  'by_epoch=False' 默认使用 `IterBaseLoop`
train_cfg = dict(by_epoch=True, max_epochs=100, val_interval=1)
# 使用默认的验证循环控制器
val_cfg = dict()
# 使用默认的测试循环控制器
test_cfg = dict()

# 通过默认策略自动缩放学习率,此策略适用于总批次大小 256
# 如果你使用不同的总批量大小,比如 512 并启用自动学习率缩放
# 我们将学习率扩大到 2 倍
auto_scale_lr = dict(base_batch_size=256)

运行设置

本部分主要包括保存权重策略、日志配置、训练参数、断点权重路径和工作目录等等。

# 默认所有注册器使用的域
default_scope = 'mmpretrain'

# 配置默认的 hook
default_hooks = dict(
    # 记录每次迭代的时间。
    timer=dict(type='IterTimerHook'),

    # 每 100 次迭代打印一次日志。
    logger=dict(type='LoggerHook', interval=100),

    # 启用默认参数调度 hook。
    param_scheduler=dict(type='ParamSchedulerHook'),

    # 每个 epoch 保存检查点。
    checkpoint=dict(type='CheckpointHook', interval=1),

    # 在分布式环境中设置采样器种子。
    sampler_seed=dict(type='DistSamplerSeedHook'),

    # 验证结果可视化,默认不启用,设置 True 时启用。
    visualization=dict(type='VisualizationHook', enable=False),
)

# 配置环境
env_cfg = dict(
   # 是否开启 cudnn benchmark
    cudnn_benchmark=False,

    # 设置多进程参数
    mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),

    # 设置分布式参数
    dist_cfg=dict(backend='nccl'),
)

# 设置可视化工具
vis_backends = [dict(type='LocalVisBackend')] # 使用磁盘(HDD)后端
visualizer = dict(
    type='UniversalVisualizer', vis_backends=vis_backends, name='visualizer')

# 设置日志级别
log_level = 'INFO'

# 从哪个检查点加载
load_from = None

# 是否从加载的检查点恢复训练
resume = False

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值