如何在 PyTorch 中实现 MLP 模块的全局结构化剪枝

冬枫吖_7418

冬枫吖_7418

2026-11-11

236人浏览

原创

如何在 PyTorch 中实现 MLP 模块的全局结构化剪枝

本文介绍一种自定义方法,实现对神经网络中多个全连接层(如 fc1/fc2/fc3)的全局结构化剪枝:基于所有目标层神经元的 Lⁿ 范数统一排序,按指定比例(如 80%)整体裁剪最不重要神经元及其全部连接,而非逐层独立剪枝。

本文介绍一种自定义方法,实现对神经网络中多个全连接层(如 fc1/fc2/fc3)的**全局结构化剪枝**:基于所有目标层神经元的 lⁿ 范数统一排序,按指定比例(如 80%)整体裁剪最不重要神经元及其全部连接,而非逐层独立剪枝。

PyTorch 的 prune.ln_structured 默认执行局部剪枝——即对每个层单独计算并裁剪其权重矩阵中范数最小的通道(对应输出神经元),这会导致各层实际剪枝比例虽一致,但被裁剪的神经元总数未必满足模型级稀疏度目标。而全局结构化剪枝要求将多个层视为一个逻辑整体,统一评估、排序和裁剪神经元,从而精确控制整个子网络(如整个 MLP 头部)的神经元保留率。

以下是一个健壮、可复用的 global_structured_prune 函数实现:

import torch
import torch.nn.utils.prune as prune
import torch.nn as nn

def global_structured_prune(model, layers, amount=0.8, norm=2):
    """
    对指定全连接层执行全局结构化剪枝(按神经元裁剪)。

    Args:
        model: 待剪枝的 PyTorch 模型
        layers: 字符串列表,如 ['fc1', 'fc2', 'fc3'],需为 nn.Linear 层
        amount: 裁剪比例(0~1),表示裁剪掉总神经元数的 amount 比例
        norm: 用于计算神经元重要性的 L-norm(默认 L2)
    """
    # Step 1: 收集所有目标层的神经元 L-norm(沿输入维度,即 dim=1)
    all_norms = []
    layer_neuron_norms = {}

    for name in layers:
        layer = getattr(model, name)
        if not isinstance(layer, nn.Linear):
            raise ValueError(f"Layer '{name}' is not an nn.Linear instance.")
        weight = layer.weight.detach()
        # 对每个输出神经元(weight 的行)计算范数:shape (out_features,)
        neuron_norms = torch.norm(weight, p=norm, dim=1)
        all_norms.append(neuron_norms)
        layer_neuron_norms[name] = neuron_norms

    # 合并所有神经元范数,形成全局一维张量
    all_norms_flat = torch.cat(all_norms)

    # Step 2: 计算全局阈值 —— 第 k 小的范数值(k = 裁剪总数)
    total_neurons = all_norms_flat.numel()
    k = int(amount * total_neurons)
    if k <p>✅ <strong>使用示例:</strong></p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2727" title="PyTorch Linux版 2.11.0"><img
														src="https://img.php.cn/upload/manual/000/969/633/6a96345535ac5642.png" alt="PyTorch Linux版 2.11.0" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/gongju/2727" title="PyTorch Linux版 2.11.0" class="overflowclass">PyTorch Linux版 2.11.0</a>
													<p class="overflowclass">PyTorch 2.11.0 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、实验复现和指定环境安装。</p>
												</div>
												<a rel="nofollow" href="/xiazai/gongju/2727" title="PyTorch Linux版 2.11.0" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div><pre class="brush:php;toolbar:false;">model = SimpleCNN()
global_structured_prune(model, layers=['fc1', 'fc2', 'fc3'], amount=0.8, norm=2)
print("Global pruning completed: ~80% of MLP neurons removed.")

⚠️ 关键注意事项:

  • dim=0 是核心:prune.ln_structured(..., dim=0) 表示按权重矩阵的行(即输出神经元) 进行结构化剪枝,确保整个神经元及其所有输入连接被移除;若误设 dim=1,则会按列(输入特征)剪枝,破坏结构化语义。
  • 剪枝不可逆:该操作会向模型添加 PruningModuleWrapper,修改 weight 为 weight_orig + weight_mask。如需导出或微调,请调用 prune.remove() 清理包装器。
  • Norm 选择建议:norm=2(L2)最常用;norm=1 更鲁棒于异常值;norm=float('inf') 等价于最大绝对值,适合强调最强连接。
  • 兼容性:本函数仅支持 nn.Linear 层;若需扩展至卷积层(按输出通道剪枝),需将 dim=1(卷积核的 out_channels 维度)并调整范数计算方式(如 torch.norm(weight, p=norm, dim=(1,2,3)))。

通过此方法,你可以精准控制整个 MLP 子网络的神经元稀疏度,为模型压缩、推理加速或结构化稀疏研究提供可靠基础。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

pytorch

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1911

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5304

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1849

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

32137

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3807

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3807

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1263

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2963

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程