通过在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
采用混合精度的训练方法使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。
以FP16算子为例,如果输入数据类型为FP32,MindSpore后台会自动降低精度来处理数据。用户可打开INFO日志,搜索“reduce precision”查看精度降低的算子。
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
Ascend处理器环境运行
# 运行分布式无监督训练示例
python main_moco.py
# 运行线性分类示例
用法:python main_lincls.py [CKPT_DIR]
实例:python main_lincls.py /path/mocov2.ckpt
└── 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处理器环境运行
# 运行分布式无监督训练示例
python main_moco.py
# 运行线性分类示例
用法: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
...
...
在Ascend环境运行评估
线性分类实现了边训练边推理的话,因此推理同线性分类训练流程。
测试数据集的准确性如下:
{'Acc@1': 0.6273249773979187, 'Acc@5': 0.836995005607605}
python export.py --ckpt_file [CKPT_PATH] --file_format [FILE_FORMAT]
ckpt_file
ckpt文件路径file_format
导出模型格式,["AIR", "ONNX", "MINDIR"]在执行推理前,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
参数 | 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文件) |
待补充
无
请浏览官网主页。
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》