1 训练所需参数
1.1 需要的参数
timm训练脚本需要的唯一参数是训练数据的路径
比如我们数据长这样:
因此为例训练imagenette2-320数据,我们需要:
python train.py <path_to_imagenette2-320_dataset>
1.2 默认参数
How to train your own models using timm? | timmdocs
2 训练脚本的各个步骤
在本节中,我们将从宏观的角度来研究训练脚本中的各个步骤。
- 如果args.distributed=True,设置分布式训练参数。
- 为可重复的结果设置手动种子。(manual seed)
- 使用timm.create_model 创建模型
- 根据模型的默认配置设置数据配置。一般情况下,模型的默认配置如下:
{'url': '', 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': (7, 7), 'crop_pct': 0.875, 'interpolation': 'bicubic', ' mean': (0.485, 0.456, 0.406), 'std': (0.229, 0.224, 0.225), 'first_conv': 'conv1', 'classifier': 'fc'}
- 设置扩增批分割,如果扩增批分割( augmentation batch splits)的数量大于1,将所有模型的BatchNormlayers转换为Split batch Normalization层。 通常,当我们训练一个模型时,我们将数据增强【data augmentation】应用于完整批【batch】,然后从这个完整批定义批规范【batch norm】统计数据,如均值和方差。 但有时将数据分成组,并为每个组使用单独的批处理归一化层【Batch Normalization layers】来独立地归一化组是有益的。这在一些论文中被称为辅助批规范【auxiliary batch norm】,在timm中被称为SplitBatchNorm2d。 我们假设augmentation batch splits数量是2。我们将数据拆分成两个组,一组没有数据增强,一组有数据增强。然后我们使用两个独立的批处理归一化层【Batch Normalization layers】来归一化两个组别
- 如果我们使用多个gpu进行训练,那么设置apex syncBN或PyTorch native SyncBatchNorm,来设置Synchronized Batch Normalization。这意味着我们不是对每个单独的GPU上的数据进行归一化,而是在多个GPU上对整个批处理进行归一化。
- 使用torch.jit,如果我们需要有输出
- 根据传递给训练脚本的参数,初始化优化器
- 设置混合精度——使用apex.amp 或者torch.cuda.amp.autocast
- 如果是从某一个模型checkpoint 继续的,加载模型权重
- 设置模型权重的指数移动平均【exponential moving average】
- 根据步骤1中的参数设置分布式训练
- Setup learning rate scheduler.
- 建立训练集和验证集
- Setup Mixup/Cutmix data augmentation.
- 如果第五步augmentation batch splits数量大于1,那么将训练数据集转换成`AugmixDataset`
- 创建训练集和验证集的data loader
- 设置损失函数
- 设置模型保存点、模型评估指标
- 训练并验证模型,将评估结果保存到一个文件中
3 EMA (Exponential Moving Average)
机器学习笔记:Momentum_UQI-LIUWJ的博客-CSDN博客
使用EMA训练模型,添加--model-ema
定义EMA的衰减率,使用--model-ema-decay + 值
model_weights = decay * model_weights + (1 - decay) * new_model_weights
3.1 不使用EMA举例
python train.py ../imagenette2-320 --model resnet34
3.2 使用EMA举例
python train.py ../imagenette2-320 --model resnet34 --model-ema --model-ema-decay 0.99