目录
mocov2描述
通过在MoCo框架中实现SimCLR的两个设计改进来验证它们的有效性。通过对MoCo进行简单的修改——即使用MLP投影头和更多的数据增强——我们建立了更强的基线,优于SimCLR,并且不需要大规模的训练批次。
论文:Chen, Xinlei, et al. "Improved baselines with momentum contrastive learning." arXiv preprint arXiv:2003.04297 (2020).
模型架构
Moco整体架构为,一个Batch的数据假设有n个image,这里面有一个样本 query和它所对应的正样本, 和来自同一张图片的不同的 Data Augmentation,这个Batch剩下的数据就是负样本。接着只把query和正样本输入给2个架构相同但参数不同的Encoder和Momentum Encoder。所有的负样本都会保存在一个队列Queue里面。然后对两个Encoder的输出使用Contrastive loss损失函数使得query和正样本的相似程度尽量地高,使得query和负样本的相似程度尽量地低。在任意一个Epoch的任意一个step里面,使用反向传播来更新Encoder 的参数,通过采用Momentum update方法复制正例Encoder的参数。同时,队列删除掉尾部的一个Batch大小的负样本,再在头部进来一个Batch大小的负样本,完成这个step的队列的更新。这样,队列的大小可以远远大于Batch size的大小了,使得负样本的数量可以很多,提升了自监督训练的效果。
数据集
使使用的数据集:ImageNet2012
- 数据集大小:125G,共1000个类、1.2万张彩色图像
- 训练集:120G,共1.2万张图像
- 测试集:5G,共5万张图像
- 数据格式:RGB
特性
混合精度
采用混合精度的训练方法使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。
以FP16算子为例,如果输入数据类型为FP32,MindSpore后台会自动降低精度来处理数据。用户可打开INFO日志,搜索“reduce precision”查看精度降低的算子。
环境要求
- 硬件(Ascend/GPU)
- 框架
- 如需查看详情,请参见如下资源:
快速入门
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
脚本说明
脚本及样例代码
└── mocov2
├── README_CN.md // uflow相关说明
├── scripts
│ ├── run_distribute_moco_train.sh // 分布式到Ascend的无监督训练shell脚本
│ └── run_distribute_lincls_train.sh // 分布式到Ascend的线性分类shell脚本
├── moco
├── loader.py // 创建数据集
├── builder.py // uflow架构
├── lr_scheduler.py //动态学习率
├── logger.py //日志打印
└── resnet.py //resnet网络架构
├── main_moco.py // 无监督训练脚本
├── main_lincls.py // 线性分类脚本
└── export.py //将checkpoint文件导出为mindir文件
脚本参数
在config.py中可以同时配置训练参数和评估参数。
batch_size:256 #训练批次大小
epoch: 200 #总计训练epoch数
learning rate: 0.03 #初始学习率
loss function: SoftmaxCrossEntropyWithLogits #损失函数
optimizer: Momentum #优化器
moco-dim: 128 #特征维度
moco-k: 65536 #队列尺寸
moco-m: 0.999 #密钥编码器更新的moco动量
moco-t: 0.2 #softmax temperature
mlp: True #use mlp head
aug-plus: True #是否使用数据增强
cos: True #是否使用cos学习率衰减
训练过程
分布式训练
-
Ascend处理器环境运行
# 运行分布式无监督训练示例
bash run_distribute_moco_train.sh
OR
python main_moco.py
# 运行线性分类示例
用法:bash run_distribute_lincls_train.sh [CKPT_DIR]
实例:bash run_distribute_lincls_train.sh /path/mocov2.ckpt
OR
用法:python main_lincls.py [CKPT_DIR]
实例:python main_lincls.py /path/mocov2.ckpt
上述shell脚本将在后台运行分布训练。您可以通过train_parallel[X]/log文件查看结果。采用以下方式达到损失值:
# 无监督训练日志
Epoch:[ 0/200], batch:[5003/5004], step:[ 5003/1000800], loss:[8.4052/8.4052], lr:0.030000, time:1877844.24ms
Epoch:[ 0/200], batch:[5003/5004], step:[ 5003/1000800], loss:[8.1856/8.1856], lr:0.030000, time:1878014.48ms
Epoch:[ 0/200], batch:[5003/5004], step:[ 5003/1000800], loss:[8.5887/8.5887], lr:0.030000, time:1877495.51ms
...
Epoch:[ 6/200], batch:[5003/5004], step:[ 35027/1000800], loss:[7.2996/7.2996], lr:0.029933, time:1509865.95ms
Epoch:[ 6/200], batch:[5003/5004], step:[ 35027/1000800], loss:[7.3983/7.3983], lr:0.029933, time:1506141.49ms
Epoch:[ 6/200], batch:[5003/5004], step:[ 35027/1000800], loss:[7.5185/7.5185], lr:0.029933, time:1509891.24ms
...
...
# 线性分类训练日志
Epoch:[ 0/100], batch:[5004/5005], step:[ 5004/500500], loss:[10.2805/10.2805], lr:30.000000, time:1087408.01ms
Epoch:[ 0/100], batch:[5004/5005], step:[ 5004/500500], loss:[10.7694/10.7694], lr:30.000000, time:1087609.78ms
Epoch:[ 0/100], batch:[5004/5005], step:[ 5004/500500], loss:[6.2461/6.2461], lr:30.000000, time:1087277.61ms
...
Epoch time: 1094419.45 ms, per step time: 218.67 ms, avg loss: 8.1599
Epoch time: 1099555.72 ms, per step time: 219.69 ms, avg loss: 7.4814
...
...
评估过程
评估
推理过程
导出MindIR
python export.py --ckpt_file [CKPT_PATH] --file_format [FILE_FORMAT]
ckpt_file
ckpt文件路径
file_format
导出模型格式,["AIR", "ONNX", "MINDIR"]
在Ascend310执行推理
在执行推理前,mindir文件必须通过export.py
脚本导出。以下展示了使用mindir模型执行推理的示例。
目前imagenet2012数据集仅支持batch_Size为1的推理。
# Ascend310 inference
bash run_infer_310.sh [MINDIR_PATH] [DATASET_PATH] [DEVICE_ID]
MINDIR_PATH
mindir文件路径
DATASET_PATH
推理数据集路径
DEVICE_ID
可选,默认值为0。
结果
推理结果保存在脚本执行的当前路径,你可以在acc.log中看到以下精度计算结果。
'acc': 0.625
模型描述
性能
评估性能
ImageNet上的mocov2
参数 |
Ascend 910 |
模型版本 |
mocov2 |
资源 |
Ascend 910;CPU:2.60GHz,192核;内存:755G |
上传日期 |
2023-05-12 |
MindSpore版本 |
r1.8 |
数据集 |
ImageNet2012 |
训练参数 |
epoch=200, steps per epoch=5004, batch_size = 256 |
优化器 |
Momentum |
损失函数 |
SoftmaxCrossEntropyWithLogits |
输出 |
概率 |
损失 |
6.47 |
速度 |
299.78毫秒/步(8卡) |
总时长 |
85小时 |
微调检查点 |
356M(.ckpt文件) |
迁移学习
待补充
随机情况说明
无
ModelZoo主页
请浏览官网主页。