我们可以永久地修剪Tensorflow低量级权重吗?



我有一个TensorFlow模型,我可以应用修剪器。prune_low_magnitude图层到我的Dense图层的输出。这似乎根据说明工作,我得到几乎相同的结果,降低到95%的稀疏性。GPU和CPU的处理时间似乎是一样的。看起来修剪层正在计算所有的权值,然后将最小的权值设置为零,以符合稀疏性图。这样对吗?

当然,如果能加速就好了,但就我目前的目的而言,这是可以的。

我想修剪权值,让它们此后保持为零。我会减少一些权重;然后继续训练,让模型从修剪中恢复过来;然后再修剪一些。我觉得这应该更接近真实神经元的功能。有什么办法可以做到吗?

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

当然,如果能获得加速就好了,但就我目前而言目的,这是好的。

为了减少推理时间,op(在您的示例中是Dense)实现需要能够利用稀疏性及其运行的特定硬件。CPU/GPU上的Tensorflow运行时还不支持这个,但是TFLite支持。的在XNNPACK教程中演示了设备上推理的修剪。

我想修剪权值并使它们此后保持为零。我会减少一些权重;然后让模型继续训练修剪:从修剪中恢复;然后再修剪一些。我觉得这应该更接近真实神经元的功能。有什么办法吗这个吗?

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

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

我的解决方案(还不起作用)是添加一个自定义图层可训练的= false。这有一个掩码数组,开始是全1,如果对应的权值为零,则设为零。层将权重乘以这个掩码数组,因此一旦权重变为0,它保持为0。这应该起作用吗?有没有更好的办法?

这基本上是Tensorflow模型优化在引擎盖下做的:pruning_implp .py。你只需要应用prune_low_magnitude()按照修剪与Keras教程。

相关内容

  • 没有找到相关文章

最新更新