【问题标题】:Can we permanently prune Tensorflow low magnitude weights?我们可以永久修剪 Tensorflow 低幅度权重吗?
【发布时间】:2021-08-10 11:01:51
【问题描述】:

我有一个 TensorFlow 模型,我可以在其中将 pruner.prune_low_magnitude 层应用于我的 Dense 层的输出。这似乎按照说明工作,我得到几乎相同的结果,直到 95% 的稀疏度。 GPU 和 CPU 的处理时间似乎相同。修剪层似乎正在计算所有权重,然后将最小的权重设置为零以适应稀疏图。是这样吗?

当然,加快速度会很好,但就我目前的目的而言,这很好。

我想修剪权重,然后让它们保持为零。我会修剪一些重量;然后继续训练,让模型从剪枝中恢复;然后再修剪一下。我觉得这应该更接近真正的神经元所做的。有没有办法做到这一点?

我的解决方案(目前还不行)是添加一个自定义层,Trainable=false。这有一个掩码数组,从全1开始,如果相应的权重为零,则设置为零。该层将权重乘以这个掩码数组,因此一旦权重变为零,它将保持为零。这应该工作吗?有没有更好的办法?

【问题讨论】:

    标签: tensorflow layer tf.keras


    【解决方案1】:

    当然,如果能加快速度就好了,但就我现在而言 目的,这很好。

    为了减少推理时间,op(在您的示例中为 Dense)实现需要能够利用稀疏性和运行它的特定硬件。 CPU/GPU 上的 Tensorflow 运行时还不支持这一点,但 TFLite 支持。这 Pruning for on-device inference w/ XNNPACK 教程演示了这一点。

    我想修剪权重,然后让它们保持为零。 我会修剪一些重量;然后继续训练以允许模型 从修剪中恢复;然后再修剪一下。我觉得这应该 更接近真正的神经元所做的事情。有什么办法吗 这个?

    这是作为参数传递给prune_low_magnitude() 的修剪计划的职责。

    现有实现,例如 ConstantSparsityPolynomialDecay 执行您所描述的操作:仅在某些步骤进行修剪,并让模型在其间恢复。 begin_stepend_stepfrequency 参数可让您控制在训练期间应用修剪的时间和频率。

    我的解决方案(目前还不行)是添加一个自定义层 可训练=假。这有一个掩码数组,一开始就是所有的, 如果相应的权重为零,则设置为零。层 将权重乘以这个掩码数组,所以一旦权重变为 零,它将保持为零。这应该工作吗?有没有更好的办法?

    这基本上就是 Tensorflow 模型优化在幕后的工作方式:pruning_impl.py。你只需要按照Pruning with Keras tutorial申请prune_low_magnitude()

    【讨论】:

    • 我调查了 prune_low_magnitude()。我认为反向传播的行为就像 prune_low_magnitude() 不存在一样,然后删除了最低的权重。因此,在一次迭代中不存在的权重可以回来。我想写的更像是 Disentangled VAE(我最近才发现的一个术语)。
    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2016-04-01
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多