Magnitude-based weight pruning with Keras(keras模型权重裁剪)

本文介绍如何在Keras中应用权重删减,通过消除低权重连接以实现模型压缩和加速。通过训练一个MNIST模型并展示在TensorFlow Lite中的应用,证明了模型大小的减小和准确性保持。同时,讨论了权重修剪与其他优化技术如训练后量化相结合的可能性。
摘要由CSDN通过智能技术生成

keras模型权重裁剪
https://github.com/lixiaolei1982/model-optimization/blob/master/tensorflow_model_optimization/g3doc/guide/pruning/pruning_with_keras.ipynb
一,什么是权重删减:
消除权重张量中不必要的值。将神经网络参数的值设置为零,以消除神经网络各层之间的低权重连接。
二,带来好处:
多个值设置为零的张量可以被视为稀疏张量。这将带来重要的好处:
1.压缩:稀疏张量只保留非零值及其对应的坐标,因而易于压缩。
2.速度:稀疏张量允许我们跳过涉及零值的不必要计算。
三,如何work
我们基于Keras的权重剪枝API设计用于在训练期间根据连接的大小迭代删除连接。有关API使用的更多详细信息,请参阅GitHub页面。
在本教程中,我们将向您介绍在简单MNIST模型上使用权重修剪API的端到端示例。我们将显示,通过简单地使用通用文件压缩算法(例如zip),Keras模型的大小将减小,并且当转换为Tensorflow Lite格式时,这种大小减小将持续存在。
有两件事值得澄清:
1.该技术和API不是TensorFlow Lite特有的——我们只是在TensorFlow Lite后端展示它的应用程序,因为它涵盖了大小敏感的用例。
2.稀疏模型本身的执行速度不会更快。它只允许后端具有这样的功能。然而,在不久的将来,TensorFlow Lite将利用稀疏性加快计算速度。

四,概括:
概括地说,在本教程中,我们将:
1.从零开始用Keras训练一个MNIST模型。
2.使用修剪API训练修剪MNIST。
3.比较压缩后修剪模型和未修剪模型的大小。
4.将修剪后的模型转换为Tensorflow Lite格式,并验证准确性是否仍然存在。
5.演示剪枝模型如何与其他优化技术(如训练后量化)协同工作。

五,setup
要使用修剪API,请安装tensorflow模型优化包(tensorflow-model-optimization package)。有关兼容的API版本,请参阅TensorFlow模型优化repo。
由于您将在本教程中培训一些模型,因此请安装tensorflow gpu包以加快速度。

六,使用修剪API训练修剪MNIST
提供一个prune_low_magnitude()API 来训练具有移除连接的模型。基于Keras的API可以应用于各个层或整个模型的级别。我们将在下面的部分向您展示这两种方法的用法。
在较高的层次上,该技术通过迭代删除(即归零)层之间的连接来工作,给定一个调度和目标稀疏性。
例如,一个典型的配置将以90%的稀疏性为目标,从步骤2000开始,每100步(也称为epoch)修剪一次连接。有关可能的配置的更多详细信息,请参阅github文档。

     逐层构建修剪模型,在这个例子中,我们展示了如何在层的层次上使用API,并构建一个修剪的MNIST解算器模型。在这种情况下,prune_low_magnitude()将要修剪其权重的层作为参数接收。              此函数需要一个剪枝参数,用于在训练期间配置剪枝算法。有关详细文档,请参阅我们的github页面。此处使用的参数表示: 
          1.稀疏。多项式是贯穿整个训练过程的。我们从稀疏度50%开始,逐步训练模型,使其达到90%的稀疏度。X%稀疏意味着X%的权重张量将被剪除。
           2.时间表。从步骤2000到训练结束,连接被修剪,并且每100步运行一次。其背后的原因是,我们希望在不修剪几个时期的情况下训练模型,以达到一定的精度,帮助收敛。此外,我们还给出了模型在每一个修剪步骤之后恢复的时间,因此修剪不会在每一个步骤发生。我们把修剪频率设为100。

A.在层的层次上使用API
1.加载API

from tensorflow_model_optimization.sparsity import keras as sparsity

2.计算step

import numpy as np

epochs = 12
num_train_samples = x_train.shape[0]
end_step = np.ceil(1.0 * num_train_samples / batch_size).astype(np.int32) * epochs
print('End step: ' + str(end_step))

3.典型的配置将以90%的稀疏性为目标,从步骤2000开始,每100步(也称为epoch)修剪一次连接. 并建立模型。prune_low_magnitude使用在有权重的卷积与全连接层。

pruning_params = {
   
      'pruning_schedule': sparsity.PolynomialDecay(initial_sparsity=0.50,
                                                   final_sparsity=0.90,
                                                   begin_step=2000,
                                                   end_step=end_step,
                                                   frequency=100)
}

l = tf.keras.layers

pruned_model = tf.keras.Sequential([
    sparsity.prune_low_magnitude(
        l.Conv2D(32, 5, padding='same', activation='relu'),
        input_shape=input_shape,
        **pruning_params),
    l.MaxPooling2D((2, 2), (2, 2), padding='same'),
    l.BatchNormalization(),
    sparsity.prune_low_magnitude(
        l.Conv2D(64, 5, padding='same', activation='relu'), **pruning_params),
    l.MaxPooling2D((2, 2),
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值