Path: blob/master/site/zh-cn/model_optimization/guide/combine/cqat_example.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
聚类保留量化感知训练 (CQAT) Keras 示例
概述
这是一个展示聚类保留量化感知训练 (CQAT) API 用法的端到端示例,该 API 是 TensorFlow 模型优化工具包的协作优化流水线的一部分。
其他页面
有关流水线和其他可用技术的简介,请参阅协作优化概述页面。
目录
在本教程中,您将:
从头开始为 MNIST 数据集训练一个
tf.keras
模型。通过聚类对模型进行微调,并查看准确率。
应用 QAT 并观察聚类损失。
应用 CQAT 并观察之前应用的聚类已被保留。
生成一个 TFLite 模型并观察对其应用 CQAT 的效果。
将获得的 CQAT 模型准确率与使用训练后量化所量化的模型进行比较。
安装
您可以在本地 virtualenv 或 Colab 中运行此 Jupyter 笔记本。有关设置依赖项的详细信息,请参阅安装指南。
在不使用聚类的情况下为 MNIST 训练 tf.keras 模型
评估基准模型并保存以备稍后使用
使用 8 个聚类对模型进行聚类和微调
应用 cluster_weights()
API 对整个预训练模型进行聚类,以演示并观察其不仅能够在应用 zip 时有效缩减模型大小,还能保持良好的准确率。有关如何在保持目标准确率的同时以最佳方式使用 API 实现最佳压缩率,请参阅聚类综合指南。
定义模型并应用聚类 API
在使用聚类 API 之前,需要对模型进行预训练。
微调模型并根据基准评估准确率
在 3 个周期内使用聚类对模型进行微调。
定义辅助函数来计算和打印模型每个内核中的聚类数。
检查模型内核是否已正确聚类。我们需要先剥离聚类包装器。
对于本示例,与基准相比,聚类后的测试准确率损失最小。
应用 QAT 和 CQAT 并检查两种情况下对模型聚类的影响
接下来,我们对聚类的模型同时应用 QAT 和聚类保留 QAT (CQAT),并观察 CQAT 在聚类的模型中保留权重聚类。请注意,在应用 CQAT API 之前,我们使用 tfmot.clustering.keras.strip_clustering
从模型中剥离了聚类包装器。
查看 CQAT 模型的压缩优势
定义辅助函数以获取压缩的模型文件。
请注意,这是一个小模型。将聚类和 CQAT 应用于更大的生产模型将产生更明显的压缩效果。
查看从 TF 到 TFLite 的准确率持久性
定义一个辅助函数,基于测试数据集评估 TFLite 模型。
评估已被聚类和量化的模型后,您将看到 TFLite 后端保持 TensorFlow 的准确率。
应用训练后量化并与 CQAT 模型进行比较
接下来,我们对聚类的模型使用训练后量化(无微调),并根据 CQAT 模型检查其准确率。这演示了为什么需要使用 CQAT 来提高量化模型的准确率。差异可能不是很明显,因为 MNIST 模型非常小并且过度参数化。
首先,根据前 1000 个训练图像定义一个校准数据集生成器。
对模型进行量化并将准确率与先前获得的 CQAT 模型进行比较。请注意,通过微调量化的模型会实现更高的准确率。
结论
在本教程中,您学习了如何创建模型,使用 cluster_weights()
API 对其进行聚类,以及应用聚类保留量化感知训练 (CQAT) 以在使用 QAT 时保留聚类。将最终的 CQAT 模型与 QAT 模型进行了比较,以表明前者保留了聚类,而后者丢失了聚类。接下来,将模型转换为 TFLite 以显示链式聚类和 CQAT 模型优化技术的压缩优势,并评估 TFLite 模型以确保在 TFLite 后端保持准确率。最后,将 CQAT 模型与使用训练后量化 API 实现的量化聚类模型进行比较,以展示 CQAT 在恢复正常量化的准确率损失方面的优势。