量化示例
量化前提
- 模型准备
以昇腾模型压缩工具的安装用户将需要重训练的TensorFlow模型文件和权重文件上传到Linux服务器任意目录下。
本手册以sample/resnet_v1_50模型为例进行说明,该路径下的pre_model/ResNet50_train.meta用于重训练;pre_model/ResNet50_eval.meta用于验证。
- 数据集准备
由于重训练需要使用大量数据对量化参数进行进一步优化,因此重训练数据需要与模型训练数据一致。ResNet50的数据集是在ImageNet的子集ILSVRC-2012-CLS上训练而来,因此需要用户自己准备TFRecord格式的数据集。如果更换其他数据集,则需要自己进行数据预处理。
量化步骤
- 重训练resnet_v1_50网络模型。切换到sample/resnet_v1_50目录,执行如下命令重训练resnet_v1_50网络模型。
python3.7.5 resnet_v1_50_retrain_sample.py --train_set TRAIN_SET [--train_keyword TRAIN_KEYWORD] --eval_set EVAL_SET [--eval_keyword EVAL_KEYWORD] --train_model TRAIN_MODEL --eval_model EVAL_MODEL
上述命令只给出了常用的参数,不常用参数以及各个参数解释请参见如下表格:
表4-18 重训练所用参数说明参数
说明
-h
- 是否必填:否。
- 参数解释:显示帮助信息。
--train_set TRAIN_SET
- 是否必填:是。
- 数据类型:string。
- 默认值:None。
- 参数解释:测试数据集路径。
--train_keyword TRAIN_KEYWORD
- 是否必填:否。
- 数据类型:string。
- 默认值:None。
- 参数解释:用于筛选训练集路径下包含该关键词的文件,若未定义,则默认训练集路径下所有文件作为训练集。
--eval_set EVAL_SET
- 是否必填:是。
- 数据类型:string。
- 默认值:None。
- 参数解释:验证数据集路径。
--eval_keyword EVAL_KEYWORD
- 是否必填:否。
- 数据类型:string。
- 默认值:None。
- 参数解释:用于筛选训练集路径下包含该关键词的文件,若未定义,则默认验证集路径下所有文件作为验证集。
--train_model TRAIN_MODEL
- 是否必填:是。
- 数据类型:string。
- 默认值:./pre_model/resnet_v1_50_train.meta
- 参数解释:训练用模型路径。
--eval_model EVAL_MODEL
- 是否必填:是。
- 数据类型:string。
- 默认值:./pre_model/resnet_v1_50_eval.meta
- 参数解释:验证模型路径。
--num_parallel_reads NUM_PARALLEL_READS
- 是否必填:否。
- 数据类型:int。
- 默认值:4。
- 参数解释:用于读取数据集的线程数,根据硬件运算能力酌情调整。
--buffer_size BUFFER_SIZE
- 是否必填:否。
- 数据类型:int。
- 默认值:1000。
- 参数解释:数据集乱序的缓存大小,根据内存空间酌情调整。
--repeat_count REPEAT_COUNT
- 是否必填:否。
- 数据类型:int。
- 默认值:0。
- 参数解释:数据集重复次数,若为0则无限循环。
--batch_size BATCH_SIZE
- 是否必填:否。
- 数据类型:int。
- 默认值:32。
- 参数解释:TensorFlow运行一次所使用的样本数量,根据内存或显存大小酌情调整。
--ckpt CKPT_PATH
- 是否必填:否。
- 数据类型:string。
- 默认值:None。
- 参数解释:ResNet V1 50模型的官方权重checkpoint文件路径,若未提供,则自动下载。
--learning_rate LEARNING_RATE
- 是否必填:否。
- 数据类型:float。
- 默认值:1e-6。
- 参数解释:学习率。
--save_interval SAVE_INTERVAL
- 是否必填:否。
- 数据类型:int。
- 默认值:1000。
- 参数解释:重训练保存间隔。
--momentum MOMENTUM
- 是否必填:否。
- 数据类型:float。
- 默认值:0.9。
- 参数解释:RMSPropOptimizer优化器的动量。
--train_iter TRAIN_ITER
- 是否必填:否。
- 数据类型:int。
- 默认值:1000。
- 参数解释:训练迭代次数。
使用样例如下:
python3.7.5 resnet_v1_50_retrain_sample.py --train_set /data/Datasets/imagenet_TF_trainset/ --eval_set /data/Datasets/imagenet_TF_evalset/
如果用户上传的测试数据集和验证数据集路径相同,为确保量化过程中使用了正确的数据集,该场景下量化命令中需要追加--train_keyword TRAIN_KEYWORD和--eval_keyword EVAL_KEYWORD参数,根据上述两个参数过滤相关文件名,确保--train_set参数使用的是测试数据集,--eval_set使用的是验证数据集。
若出现如下信息则说明重训练成功:
The model after retraining top 1 accuracy = 68.14%. The model after retraining top 5 accuracy = 88.03%.
- 重训练结果展示。重训练成功后,在sample/resnet_v1_50目录会生成如下文件:
- amct_log:记录了工具的日志信息,包括重训练过程的日志信息amct_tensorflow.log。
- results:resnet_v1_50_quantized.pb 重训练完成最后生成的量化模型。
该模型即可在TensorFlow环境进行精度仿真又可在昇腾AI处理器部署。
- tmp:重训练过程中产生的文件,包括:
- checkpoint:TensorFlow训练过程中保存的检查点。
- config.json:重训练量化配置文件,描述了如何对模型中的每一层进行重训练。如果重训练脚本所在目录下已经存在重训练配置文件,则再次调用create_quant_retrain_config接口时,如果新生成的重训练配置文件与已有的文件同名,则会覆盖已有的重训练配置文件,否则生成新的重训练配置文件。
- events.out.tfevents.xxxxxxxxxx.xxx:包含重训练时的loss信息,可使用tensorboard查看。
- record.txt:量化因子记录文件。关于该文件的原型定义请参见量化因子记录文件说明。
- resnet_v1_50.pb:重训练结束后生成的固化模型。
- resnet_v1_50_retrain-0.data-00000-of-00001:重训练过程生成的权重文件。
- resnet_v1_50_retrain-0.index:重训练过程生成的权重文件索引。
- resnet_v1_50_retrain-0.meta:用于重训练的模型文件。
- resnet_v1_50_retrain-1.data-00000-of-00001:重训练过程生成的权重文件。
- resnet_v1_50_retrain-1.index:重训练过程生成的权重文件索引。
- resnet_v1_50_retrain-1.meta:用于重训练的模型文件。
对该模型重新进行重训练时,上述结果文件将会被覆盖。