【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(下,结构化剪枝)

文章目录

      • 0. 前言
      • 1. `torch.nn.utils.prune`中的结构化剪枝方法
      • 2. PyTorch实例
        • 2.1 `random_structured`
        • 2.2 `prune.ln_structured`
      • 3. 总结

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

在前文:【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(上,非结构化剪枝)中介绍了PyTorch中的prune模型剪枝模块中的非结构化剪枝。本文将通过实例说明utils.prune中的结构化剪枝方法。

1. torch.nn.utils.prune中的结构化剪枝方法

  • prune.random_structured: 随机结构化剪枝,按照给定维度移除随机通道。
  • prune.ln_structured: Ln范数结构化剪枝,沿着给定维度移除具有最低n范数的通道。

2. PyTorch实例

首先建立一个简单的模型:

import torch
import torch.nn as nn
from torch.nn.utils import prunetorch.manual_seed(888)
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()# 创建一个简单的卷积层self.conv = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3)model = SimpleModel()

通过print(model.conv.weight)可以打印出权重为:

Parameter containing:
tensor([[[[-0.3017,  0.1290, -0.2468],[ 0.2107,  0.1799,  0.1923],[ 0.1887, -0.0527,  0.1403]]],[[[ 0.0799,  0.1399, -0.0084],[ 0.2013, -0.0352, -0.1027],[-0.1724, -0.3094, -0.2382]]],[[[ 0.0419,  0.2224, -0.1558],[ 0.2084,  0.0543,  0.0647],[ 0.1493,  0.2011,  0.0310]]]], requires_grad=True)
2.1 random_structured

这个方法会在指定维度dim(默认为-1)上剪枝一个随机通道:

prune.random_structured(model.conv, name="weight", amount=0.33)
print("Weight after RandomStructured pruning (33%):")
print(model.conv.weight)

输出为:

Weight after RandomStructured pruning (33%):
tensor([[[[-0.3017,  0.1290, -0.0000],[ 0.2107,  0.1799,  0.0000],[ 0.1887, -0.0527,  0.0000]]],[[[ 0.0799,  0.1399, -0.0000],[ 0.2013, -0.0352, -0.0000],[-0.1724, -0.3094, -0.0000]]],[[[ 0.0419,  0.2224, -0.0000],[ 0.2084,  0.0543,  0.0000],[ 0.1493,  0.2011,  0.0000]]]], grad_fn=<MulBackward0>)

由于权重的维度为[3, 1, 3, 3],我们也可以试试在其他维度(dim=0dim=2)上进行剪枝:

  • dim=0
prune.random_structured(model.conv, name="weight", amount=0.33,dim=0)
print(model.conv.weight)

输出为:

tensor([[[[-0.3017,  0.1290, -0.2468],[ 0.2107,  0.1799,  0.1923],[ 0.1887, -0.0527,  0.1403]]],[[[ 0.0799,  0.1399, -0.0084],[ 0.2013, -0.0352, -0.1027],[-0.1724, -0.3094, -0.2382]]],[[[ 0.0000,  0.0000, -0.0000],[ 0.0000,  0.0000,  0.0000],[ 0.0000,  0.0000,  0.0000]]]], grad_fn=<MulBackward0>)
  • dim=2
prune.random_structured(model.conv, name="weight", amount=0.33,dim=2)
print(model.conv.weight)

输出为:

tensor([[[[-0.3017,  0.1290, -0.2468],[ 0.2107,  0.1799,  0.1923],[ 0.0000, -0.0000,  0.0000]]],[[[ 0.0799,  0.1399, -0.0084],[ 0.2013, -0.0352, -0.1027],[-0.0000, -0.0000, -0.0000]]],[[[ 0.0419,  0.2224, -0.1558],[ 0.2084,  0.0543,  0.0647],[ 0.0000,  0.0000,  0.0000]]]], grad_fn=<MulBackward0>)
2.2 prune.ln_structured

这个方法会在指定维度dim(默认为-1)上按最小n范数剪枝一个通道:

prune.ln_structured(model.conv, name="weight",amount=0.33,n=1,dim=-1)
print(model.conv.weight)

输出为:

tensor([[[[-0.3017,  0.1290, -0.0000],[ 0.2107,  0.1799,  0.0000],[ 0.1887, -0.0527,  0.0000]]],[[[ 0.0799,  0.1399, -0.0000],[ 0.2013, -0.0352, -0.0000],[-0.1724, -0.3094, -0.0000]]],[[[ 0.0419,  0.2224, -0.0000],[ 0.2084,  0.0543,  0.0000],[ 0.1493,  0.2011,  0.0000]]]], grad_fn=<MulBackward0>)

更改dim也是同样的效果:

  • dim=0
prune.ln_structured(model.conv, name="weight",amount=0.33,n=1,dim=0)
print(model.conv.weight)

输出为:

tensor([[[[-0.3017,  0.1290, -0.2468],[ 0.2107,  0.1799,  0.1923],[ 0.1887, -0.0527,  0.1403]]],[[[ 0.0799,  0.1399, -0.0084],[ 0.2013, -0.0352, -0.1027],[-0.1724, -0.3094, -0.2382]]],[[[ 0.0000,  0.0000, -0.0000],[ 0.0000,  0.0000,  0.0000],[ 0.0000,  0.0000,  0.0000]]]], grad_fn=<MulBackward0>)
  • dim=2
prune.ln_structured(model.conv, name="weight",amount=0.33,n=1,dim=2)
print(model.conv.weight)

输出为:

tensor([[[[-0.3017,  0.1290, -0.2468],[ 0.0000,  0.0000,  0.0000],[ 0.1887, -0.0527,  0.1403]]],[[[ 0.0799,  0.1399, -0.0084],[ 0.0000, -0.0000, -0.0000],[-0.1724, -0.3094, -0.2382]]],[[[ 0.0419,  0.2224, -0.1558],[ 0.0000,  0.0000,  0.0000],[ 0.1493,  0.2011,  0.0310]]]], grad_fn=<MulBackward0>)

3. 总结

至此,prune中的非结构化剪枝和结构化剪枝介绍完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/859921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NC--介绍-未加密加密后-流量抓包对比

免责声明:本节仅做技术交流与学习... 目录 介绍: 用法: 未加密--流量抓包 加密: 攻击端 靶机 抓包分析: 介绍: nc 是一个Linux环境下常用的工具命令&#xff0c;可以用来帮助开发者查询和解决网路问题&#xff0c;通常被认为是 NetCat 工具的缩写&#xff0c;在网络工具…

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…

MySQL理解-下载-安装

MySQL理解: mysql:是一种关系型数据库管理系统。 下载&#xff1a; 进入官网MySQLhttps://www.mysql.com/ 找到download 滑动到最下方&#xff1a;有一个开源社区版的链接地址&#xff1a; 然后就下载完成了 安装&#xff1a; 双击&#xff1a; 一直next 一直next这一步&…

仓颉编程语言入门

华为在 2024 年 6 月 21 日的华为开发者大会上&#xff0c;华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言&#xff0c;并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出&#xff1a;你好&#xff0c;仓颉…

ESP32-S3方案应用设备无线交互技术,产品远程控制与语音交互

在物联网和人工智能(AI)技术融合的浪潮中&#xff0c;ESP32-S3芯片以其卓越的性能和多功能性&#xff0c;成为智能家居和工业自动化领域的明星产品。 ESP32-S3是一款基于Xtensa LX6处理器的嵌入式系统级芯片&#xff0c;具有高效、低功耗的特点。集成的Wi-Fi和蓝牙功能&#x…

浔川python代码编辑器——浔川总社部

众所周知, tkinter的Text文本框功能强大, Python自带的IDLE编辑器也是用tkinter编写的。这里作者也用tkinter的Text文本框等控件, 设计功能较齐全的文本编辑器程序。 目标功能: 编辑文本文件 编辑二进制文件 (字符会以转义序列形式显示, 如’abc\xff’) 支持ansi、gbk、utf-8…

《昇思25天学习打卡营第01天|基本介绍》

基本情况 MindSpore昇思是一个全场景深度学习框架 设计目标 MindSpore的设计目标是让深度学习开发更加简单、高效和安全 优点 简单性&#xff1a;MindSpore 有一个直观的API设计&#xff0c;使得新手也能快速上手&#xff0c;同时还支持自动微分。高效性&#xff1a;它针对…

golang中的内存缓存如何避免被GC扫描,BigCache实现原理

GC到底清理的是什么&#xff1f; Golang是函数式编程语言&#xff0c;如果是函数内定义的临时变量&#xff0c;在函数退出时会被自动清理掉不需要GC参与&#xff1b;如果使用了指针&#xff0c;那么即使函数退出了也不会将其清理&#xff0c;这个时候就需要全局的GC来清扫。 …

三大交易所全面恢复 IPO 申请

6月21日晚间&#xff0c;北交所受理了3家企业的IPO申请&#xff0c;这是北交所时隔3个月之后恢复IPO受理。6月20日晚间&#xff0c;沪深交易所各受理了1家IPO申请&#xff0c;这是沪深交易所时隔半年后再次受理IPO。这也意味着&#xff0c;三大交易所IPO受理全部恢复。 6月21日…

致敬企业家精神:比亚迪仰望发布“旷野宣言”

近年来&#xff0c;随着汽车在中国的普及&#xff0c;钟爱越野和探险的车主群体也在飞速发展壮大。 那么问题就来了&#xff1a;为什么会有这么多的人们钟爱越野和探险&#xff1f;越野精神究竟是什么&#xff1f; 作为备受关注的硬派越野车&#xff0c;比亚迪旗下的高端品牌仰…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 08:剩下的就是态度问题

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

C++基础编程100题-013 OpenJudge-1.3-11 计算浮点数相除的余数

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/11/ 描述 计算两个双精度浮点数a和b的相除的余数&#xff0c;a和b都是正数的。这里余数&#xff08;r&#xff09;的定义是&#xff1a;a k * b r&#xff0c;其中 k是整数&#xff0c; 0 < r < b。…

Spring Boot 快速入门4 ——JSR-303 数据校验

目录 一、前言 二、JSR303 简介 三、使用方法 常用注解 Validated、Valid区别 四、编写测试代码&#xff1a; 1. 实体类添加校验 2. 统一返回类型 3. 测试类 4.我们把异常返回给页面 5.抽离全局异常处理 2. 书写ExceptionControllerAdvice 一、前言 我们在日常开发…

物联网设备管理系统设计

一、引言 物联网设备管理系统设计旨在通过物联网技术实现对设备的全面监控、控制和管理&#xff0c;以提高设备的运行效率、降低运维成本&#xff0c;并确保数据的安全性和完整性。本设计将结合当前物联网技术的发展趋势和实际应用需求&#xff0c;提出一个清晰、可扩展的物联网…

鸿蒙开发系统基础能力:【@ohos.hiTraceChain (分布式跟踪)】

分布式跟踪 本模块提供了端侧业务流程调用链跟踪的打点能力&#xff0c;包括业务流程跟踪的启动、结束、信息埋点等能力。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import hi…

小鹏MONA M03实车曝光

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 小鹏汽车 MONA 系列首款车型已经官宣命名为“M03”&#xff0c;预计将于今年第三季度上市。 现在&#xff0c;这款新车的实车照片已经在网上流传开来。 此次曝光的是一款米色车漆版本&#xff0c;与当…

Twinkle Tray:屏幕亮度控制更智能

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Twinkle Tray2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你打开…

cookie和seesion的区别

cookie cookie介绍 Cookie是一种在Web浏览器和Web服务器之间传递的小文件&#xff0c;用于存储用户的一些状态信息&#xff0c;如登录信息、用户偏好等。当用户访问一个网站时&#xff0c;网站会将一个包含Cookie信息的HTTP响应头发送给浏览器&#xff0c;浏览器将这些Cookie…

【linux kernel】一文总结linux输入子系统

文章目录 一、导读二、重要数据数据结构&#xff08;2-1&#xff09;struct input_dev&#xff08;2-2&#xff09;input_dev_list和input_handler_list&#xff08;2-3&#xff09;struct input_handler 三、input核心的初始化四、常用API五、输入设备驱动开发总结(1)查看输入…

【面试题】面试官:判断图是否有环?_数据结构复试问题 有向图是否有环

type: NODE;name: string;[x: string]: any; }; [x: string]: any;}; export type Data Node | Edge; 复制代码 * 测试数据如下const data: Data[] [ { id: ‘1’, data: { type: ‘NODE’, name: ‘节点1’ } }, { id: ‘2’, data: { type: ‘NODE’, name: ‘节点2’ } },…