【问题标题】:How does pytorch L1-norm pruning works?pytorch L1-norm 修剪是如何工作的?
【发布时间】:2021-12-14 09:15:34
【问题描述】:

让我们看看我首先得到的结果。这是我模型的卷积层之一,我只显示了 11 个过滤器的权重(11 个 3x3 过滤器,通道=1)

Left side is original weight Right side is Pruned weight

所以我想知道“TORCH.NN.UTILS.PRUNE.L1_UNSTRUCTURED”是如何工作的,因为by the pytorch website said,它修剪了最低的 L1-norm 单元,但据我所知,L1-norm 修剪是一个过滤器修剪整个过滤器的修剪方法,使用this equation 来细化最低过滤器值,而不是修剪单个权重。所以我有点好奇这个函数到底是怎么工作的?

以下是我的剪枝代码

parameters_to_prune = (
    (model.input_layer[0], 'weight'),
    (model.hidden_layer1[0], 'weight'),
    (model.hidden_layer2[0], 'weight'),
    (model.output_layer[0], 'weight')
)

prune.global_unstructured(
    parameters_to_prune,
    pruning_method=prune.L1Unstructured,
    amount = (pruned_percentage/100),
)

【问题讨论】:

    标签: pytorch conv-neural-network pruning


    【解决方案1】:

    nn.utils.prune.l1_unstructured 实用程序不会修剪整个过滤器,它会修剪您在工作表中观察到的各个参数组件。也就是说,具有较低范数的组件会被屏蔽。


    这是一个在下面的 cmets 中讨论的最小示例:

    >>> m = nn.Linear(10,1,bias=False)
    >>> m.weight = nn.Parameter(torch.arange(10).float())
    >>> prune.l1_unstructured(m, 'weight', .3)
    >>> m.weight
    tensor([0., 0., 0., 3., 4., 5., 6., 7., 8., 9.], grad_fn=<MulBackward0>)
    

    【讨论】:

    • 是的,我知道它不会修剪整个过滤器,我的意思是这个函数如何决定使用 L1-norm 修剪哪些组件?换句话说,L1-norm 如何决定“具有较低范数的组件”?
    • @SnowNiNo,它将屏蔽最低的p-% 组件,其中p 是提供给修剪函数的amount
    • 所以假设我的体重是 1~10([1,2,3,4,5,6,7,8,9,10]),我的体重是 0.3,所以我'将得到 [0,0,0,4,5,6,7,8,9,10] 作为返回
    • @SnowNiNo 完全正确,请参阅上面的编辑示例。
    • 非常感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 2017-11-26
    • 2018-12-24
    • 1970-01-01
    • 2020-09-15
    • 2018-03-29
    • 2020-08-21
    • 2020-10-05
    相关资源
    最近更新 更多