由 Arm 机器学习工具团队维护
本文概要介绍了权重聚类,帮助您确定它是否适合您的用例。
概览
聚类(或权重共享)可减少模型中唯一权重值的数量,从而带来部署优势。聚类首先将每层的权重分组成 N 个聚类,然后共享属于相应聚类的所有权重的聚类形心值。
此技术通过模型压缩改进了模型。未来的框架支持能够改善内存占用,这对在资源有限的嵌入式系统上部署深度学习模型具有重大意义。
我们尝试了视觉和语音任务方面的聚类。我们发现模型压缩的性能提升了 5 倍,并且对准确率造成的影响极低,如下文列出的结果所示。
请注意,如果批次归一化层前面有卷积层和密集层,以及将聚类与按每个轴的训练后量化相结合使用,聚类提供的优势较少。
API 兼容性矩阵
用户可以使用以下 API 来应用聚类:
- 模型构建:只能对序列模型和函数式模型使用
tf.keras
- TensorFlow 版本:TF 1.x(包括版本 1.14 及更高版本)和 TF 2.x。
- 不支持对 TF 2.X 软件包使用
tf.compat.v1
,以及对 TF 1.X 软件包使用tf.compat.v2
。
- 不支持对 TF 2.X 软件包使用
- TensorFlow 执行模式:图执行和即刻执行
结果
图像分类
模型 | 原始 | 聚类 | ||||
---|---|---|---|---|---|---|
Top-1 准确率 (%) | 压缩的 .tflite 文件的大小 (MB) | 配置 | 聚类数量 | Top-1 准确率 (%) | 压缩的 .tflite 文件的大小 (MB) | |
MobileNetV1 | 71.02 | 14.96 | ||||
局部(最后 3 个 Conv2D 层) | 256、256、32 | 70.62 | 8.42 | |||
完整(所有 Conv2D 层) | 64 | 66.07 | 2.98 | |||
MobileNetV2 | 72.29 | 12.90 | ||||
局部(最后 3 个 Conv2D 层) | 256、256、32 | 72.31 | 7.00 | |||
完整(所有 Conv2D 层) | 32 | 69.33 | 2.60 |
这些模型已在 ImageNet 上进行了训练和测试。
关键字检测
模型 | 原始 | 聚类 | ||||
---|---|---|---|---|---|---|
Top-1 准确率 (%) | 压缩的 .tflite 文件的大小 (MB) | 配置 | 聚类数量 | Top-1 准确率 (%) | 压缩的 .tflite 文件的大小 (MB) | |
DS-CNN-L | 95.03 | 1.5 | 完整 | 32 | 94.71 | 0.3 |
这些模型已在 SpeechCommands v0.02 上进行了训练和测试。
- 将 Keras 模型序列化为 .h5 文件
- 使用
TFLiteConverter.from_keras_model_file()
将 .h5 文件转换为 .tflite - 将 .tflite 文件压缩成 zip 文件
示例
除了 Keras 中的权重聚类示例之外,还可参阅以下示例:
- 对用 MNIST 手写数字分类数据集训练的 CNN 模型进行权重聚类:代码
权重聚类实现基于《深度压缩:使用剪枝、经过训练的量化和霍夫曼编码压缩深度神经网络》(Deep Compression: Compressing Deep Neural Networks With Pruning, Trained Quantization and Huffman Coding) 一文。请参阅第 3 章“经过训练的量化和权重共享”(Trained Quantization and Weight Sharing)。