Path: blob/master/site/zh-cn/model_optimization/guide/pruning/comprehensive_guide.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
剪枝综合指南
设置
如果只是寻找您需要的 API 并了解其用途,您可以只运行以下代码而无需阅读本部分。
定义模型
对整个模型进行剪枝(序贯模型和函数式模型)
提高模型准确率的提示:
尝试“对某些层进行剪枝”以跳过修剪会最大程度降低准确率的层。
与从头开始训练相比,通常最好通过剪枝进行微调。
要通过剪枝训练整个模型,将 tfmot.sparsity.keras.prune_low_magnitude
应用于模型。
对某些层进行剪枝(序贯模型和函数式模型)
修剪模型可能会对准确率造成负面影响。您可以选择性地对模型的某些层进行剪枝以探索如何在准确率、速度和模型大小之间进行权衡。
提高模型准确率的提示:
与从头开始训练相比,通常最好通过剪枝进行微调。
尝试对后面的层而不是前面的层进行剪枝。
避免对关键层(例如注意力机制)进行剪枝。
更多提示:
tfmot.sparsity.keras.prune_low_magnitude
API 文档提供了有关如何更改每层的剪枝配置的详细信息。
在下面的示例中,仅对 Dense
层进行剪枝。
尽管此示例使用层的类型来决定要修剪的内容,但是对特定层进行剪枝的最简单方法是设置其 name
属性,然后在 clone_function
中查找该名称。
更具可读性,但可能会降低模型准确率
这不兼容通过剪枝进行的微调,因此,它的准确率可能低于上述支持微调的示例。
虽然在定义初始模型时可以应用 prune_low_magnitude
,但之后加载权重在以下示例中不起作用。
函数式模型示例
序贯模型示例
对自定义 Keras 层进行剪枝或修改层的部分以进行剪枝
常见误区:对偏差进行剪枝通常会严重损害模型准确率。
tfmot.sparsity.keras.PrunableLayer
适用于两个用例:
对自定义 Keras 层进行剪枝
修改内置 Keras 层的某些部分以进行剪枝
例如,API 默认只对 Dense
层的内核进行剪枝。下面的示例还会对偏差进行剪枝。
训练模型
Model.fit
在训练期间中调用 tfmot.sparsity.keras.UpdatePruningStep
回调。
为了帮助调试训练,请使用 tfmot.sparsity.keras.PruningSummaries
回调。
对于非 Colab 用户,您可以在 TensorBoard.dev 上查看此代码块先前运行的结果。
自定义训练循环
在训练期间中调用 tfmot.sparsity.keras.UpdatePruningStep
回调。
为了帮助调试训练,请使用 tfmot.sparsity.keras.PruningSummaries
回调。
对于非 Colab 用户,您可以在 TensorBoard.dev 上查看此代码块先前运行的结果。
提高剪枝模型准确率
设置检查点和进行反序列化
您必须在检查点操作期间保留优化器步骤。这意味着虽然可以在检查点操作中使用 Keras HDF5 模型,但不能使用 Keras HDF5 权重。
上述代码普遍适用。仅 HDF5 模型格式需要以下代码(HDF5 权重或其他格式不需要)。
部署剪枝模型
导出大小经过压缩的模型
常见误区:要体现剪枝的压缩优势,strip_pruning
和应用标准压缩算法(例如通过 Gzip)缺一不可。
特定于硬件的优化
当不同的后端启用剪枝以改善延迟后,使用块稀疏度可以改善某些硬件的延迟。
增加块大小将减小目标模型准确率可达到的峰值稀疏度。尽管如此,延迟仍可以改善。
有关块稀疏度支持的功能的详细信息,请参阅 tfmot.sparsity.keras.prune_low_magnitude
API 文档。