基于BatchNorm的模型剪枝【详解+代码】

news2025/1/19 2:35:38

文章目录

    • 1、BatchNorm(BN)
    • 2、L1与L2正则化
      • 2.1 L1与L2的导数及其应用
      • 2.2 论文核心点
    • 3、模型剪枝的流程

  • ICCV经典论文,通俗易懂!论文题目:Learning Efficient Convolutional Networks through Network Slimming
  • 卷积后能得到多个特征图,这些图一定都重要吗?
  • 训练模型的时候能否加入一些策略,让权重参数体现出主次之分?
  • 以上这两点就是论文的核心,先看论文再看源码其实并不难!

如下图所示,每个conv-layer会被计算相应的channel scaling factors,然后根据channel scaling factors筛选conv-layer,达到模型瘦身的作用,图中的1.170,0.001,0.290等就是下面我们将要介绍的学习参数 γ \gamma γ 值,

在这里插入图片描述

1、BatchNorm(BN)

Network slimming,就是利用BN层中的缩放因子 γ \gamma γ
整体感觉就是一个归一化操作,但是BN中还额外引入了两个可训练的参数: γ \gamma γ β \beta β

BN的公式:
x ^ ( k ) = γ ⋅ x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] + β \hat x^{(k)}=\gamma \cdot \frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}+\beta x^(k)=γVar[x(k)] x(k)E[x(k)]+β

  • 如果训练时候输入数据的分布总是改变,网络模型还能学的好吗?
    • 不能,网络刚开始学起来会很差,而且还容易导致过拟合,
  • 对于卷积层来说,它的输入可不是只有原始输入数据
    • 而是卷积层+BN层+relu层输出的数据,如果输入只来自卷积层,那么数据不在同一个分布内,网络刚开始学起来会很差,而且还容易导致过拟合
  • 以sigmoid为例,如果不经过BN层,很多输出值越来也偏离,导致模型收敛越来越难!
    在这里插入图片描述

A、BN的作用

  • BN要做的就是把越来越偏离的分布给他拉回来!
  • 再重新规范化到均值为0方差为1的标准正态分布
  • 这样能够使得激活函数在数值层面更敏感,训练更快
  • 有一种感觉:经过BN后,把数值分布强制分布在了非线性函数的线性区域中,而图像本身是非线性的,所以这是一个缺陷,所以就引入了 γ \gamma γ 参数,

B、BatchNorm参数

  • 如果都是线性的了,神经网络还有意义吗?
  • BN另一方面还需要保证一些非线性,对规范化后的结果再进行变换
  • 这两个参数是训练得到的: y ( k ) = γ x ^ ( k ) + β ( k ) y^{(k)} = \gamma \hat x^{(k)} + \beta ^{(k)} y(k)=γx^(k)+β(k)
  • 感觉就是从正态分布进行一些改变,拉动一下,变一下形状!

图中的1.170,0.001,0.290等就是学习参数 γ \gamma γ 值, γ \gamma γ 值越大则说明该特征层越重要,越小则不重要,

在这里插入图片描述

2、L1与L2正则化

如果学习到的 γ \gamma γ 值是1.17,1.16,1.15等,那如何筛选比较重要的 γ \gamma γ 值呢?使用L1正则化就可以实现筛选比较重要的 γ \gamma γ 值,

  • 论文中提出:训练时使用L1正则化能对参数进行稀疏作用,
  • L1:对权重参数稀疏与特征选择,会对一些权重参数稀疏化接近于0,
  • L2:平滑特征,会对权重参数都接近于0,

L1正则化: J ( θ → ) = 1 2 ∑ i = 1 m ( h θ ~ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ J\big(\overrightarrow{\theta}\big)= \frac{1}{2}\sum_{i=1}^m\big(h_{\widetilde{\theta}}(x^{(i)})-y^{(i)}\big)^2+\lambda \sum_{j=1}^n|\theta_j| J(θ )=21i=1m(hθ (x(i))y(i))2+λj=1nθj

L2正则化: J ( θ → ) = 1 2 ∑ i = 1 m ( h θ ~ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 J\big(\overrightarrow{\theta}\big)= \frac{1}{2}\sum_{i=1}^m\big(h_{\widetilde{\theta}}(x^{(i)})-y^{(i)}\big)^2+\lambda \sum_{j=1}^n\theta_j^2 J(θ )=21i=1m(hθ (x(i))y(i))2+λj=1nθj2

其中 h θ ~ ( x ( i ) ) h_{\widetilde{\theta}}(x^{(i)}) hθ (x(i))是预测值, y ( i ) y^{(i)} y(i)是标签值,

2.1 L1与L2的导数及其应用

L1的导数:

L1求导后为:sign( θ \theta θ),相当于稳定前进,都为 ± 1 \pm 1 ±1;所以迭代次数够多,有些特征层权重 θ \theta θ 最后可以学成0了,所以L1可以做稀疏化,

在这里插入图片描述

L2的导数:

L2求导为:θ,梯度下降过程越来越慢,相应的权重参数都接近0,起到平滑的作用,

在这里插入图片描述

2.2 论文核心点

以BN中的 γ \gamma γ 为切入点,即 γ \gamma γ 越小,其对应的特征图越不重要,
为了使得 γ \gamma γ 能有特征选择的作用,引入L1正则来控制 γ \gamma γ

L = ∑ ( x , y ) l ( f ( x , W ) , y ) + λ ∑ γ ∈ Γ g ( γ ) L=\sum_{(x,y)}l\big(f(x,W),y\big)+\lambda\sum_{\gamma \in \Gamma}g(\gamma) L=(x,y)l(f(x,W),y)+λγΓg(γ)

其中 l ( f ( x , W ) , y ) l\big(f(x,W),y\big) l(f(x,W),y)是loss损失函数, γ \gamma γ 是BN中的参数 γ \gamma γ

3、模型剪枝的流程

训练-剪枝-再训练,整体流程如下图所示,

在这里插入图片描述

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

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

相关文章

GC调优工具

1、jstat 2、VisualVM GC tool插件 插件下载地址:https://blog.csdn.net/jushisi/article/details/109655175 3、Prometheus和Grafana监控

Xshell

更改背景颜色 多个会话同时执行命令 查看 -> 撰写 -> 撰写窗格

备战蓝桥杯---动态规划(基础3)

本专题主要介绍在求序列的经典问题上dp的应用。 我们上次用前缀和来解决,这次让我们用dp解决把 我们参考不下降子序列的思路,可以令f[i]为以i结尾的最大字段和,易得: f[i]max(a[i],a[i]f[i-1]); 下面是AC代码: #in…

Go 语言 for 的用法

For statements 本文简单翻译了 Go 语言中 for 的三种用法,可快速学习 Go 语言 for 的使用方法,希望本文能为你解开一些关于 for 的疑惑。详细内容可见文档 For statements。 For statements with single condition 在最简单的形式中,只要…

Redis -- 渐进式遍历

家,是心的方向。不论走多远,总有一盏灯为你留着。桌上的碗筷多了几双,笑声也多了几分温暖。家人团聚,是最美的风景线。时间:2024年 2月 8日 12:51:20 目录 前言 语法 示例 前言 试想一个场景,那就是在key非常多的…

【数据结构与算法-初学者指南】【附带力扣原题】队列

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

【项目问题解决】java. net.SocketException: Connection reset

目录 【项目问题解决】java. net.SocketException: Connection reset 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 通过JMeter 压测接口,无并发,无间歇时间跑接口10000次报错,后续改成建个…

云卷云舒:论超级数据库、算网数据库、智算数据库

笔者大胆提出一种“超级数据库”的概念设想。 一、超级能力 就像当初提出“超级计算机”一样,我们是否同样可以提出“超级数据库”的概念呢?当然不是不可以。 二、超级计算机 我们回忆一下“超级计算机”的发展之路,大致经过了如下几个环…

Swift Combine 管道 从入门到精通三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二 1. 用弹珠图描述管道 函数响应式编程的管道可能难以理解。 发布者生成和发送数据,操作符对该数据做出响应并有可能更改它,订阅者请求并接收这些数据。 这…

FPGA实现ISP用于无人车、无人机配送的方案调研

查到一个always 奥唯思公司做的用FPGA实现ISP的方案,采用易灵思钛金16nm的FPGA Ti60F225,通过MIPI CSI RX采集图像传感器的数据,在FPGA内部经过一系列复杂的ISP运算后,再通过MIPI CSI TX将图像数据发送给后端。 一套完整的ISP&a…

【前端】实现Vue组件页面跳转的多种方式

目录 前言1. 内嵌2. 跳转新页面2.1 Demo12.2 Demo22.3 Demo3 3. 拓展 前言 通过某个Button让页面多种方式跳转 1. 内嵌 想要在Vue应用中内嵌一个外部网页&#xff0c;可以使用<iframe>标签 下面是一个示例&#xff1a; <template><div><!-- 在这里嵌入…

C语言一招教你搞定所有基础函数知识(上)

1.前言 Hello&#xff0c;大家好&#xff0c;我是小陈&#xff0c;新年快乐呀&#xff01;马上就龙年了&#xff0c;今天是大年30&#xff0c;祝各位新的一年更上一层楼&#xff0c;今天小陈为大家带来了C语言的函数基础知识&#xff0c;希望大家仔细看完。 2.函数的概念 何…

数据库切片大对决:ShardingSphere与Mycat技术解析

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 数据库切片大对决&#xff1a;ShardingSphere与Mycat技术解析 前言ShardingSphere与Mycat简介工作原理对比功能特性对比 前言 在数据库的舞台上&#xff0c;有两位颇受欢迎的明星&#xff0c;它们分别…

Unity入门学习

目录 Unity环境搭建Unity引擎是什么软件下载和安装工程文件夹 Unity界面基础Scene场景和Hierarchy层级窗口Game游戏和Project工程Inspector和Console工具栏和父子关系 Unity工作原理反射机制和游戏场景预设体和资源包的导入导出 Unity脚本基础脚本基本规则生命周期函数Inspecto…

Aethir和Well-Link Tech携手革新云游戏,释放人工智能(AI)潜力

​Aethir将为Well-Link Tech的2亿用户提供先进的GPU计算能力&#xff0c;大幅提升他们的游戏体验。 新加坡&#xff0c;2024年2月7日 - 先驱性的去中心化GPU网络Aethir与实时云渲染技术领导者Well-Link Tech携手共创云游戏和元宇宙发展的新时代。 借助Well-Link Tech对领先游戏…

算法---回溯(正文)

1.什么是回溯&#xff1f; 回溯算法的定义就是和暴力枚举一样枚举所有可能并加撤回&#xff0c;也能和暴力一样去掉一些重复&#xff08;在之前就被筛出&#xff0c;但还要枚举这个&#xff0c;我们可以跳过这个了---------这个就是回溯剪枝&#xff09;。但为什么回溯不是暴力…

分享90个行业PPT,总有一款适合您

分享90个行业PPT&#xff0c;总有一款适合您 90个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

【蓝桥杯冲冲冲】Prime Gift

【蓝桥杯冲冲冲】Prime Gift 蓝桥杯备赛 | 洛谷做题打卡day31 文章目录 蓝桥杯备赛 | 洛谷做题打卡day31Prime Gift题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示题解代码我的一些话 Prime Gift 题面翻译 给你 n n n 个…

自适应二次元404页面源码

自适应二次元404页面源码&#xff0c;HTMLCSSJS,喜欢二次元的朋友可以下载使用 蓝奏云&#xff1a;https://wfr.lanzout.com/iuPNQ1ns7dxg

Linux网络编程——udp套接字

本章Gitee地址&#xff1a;udp套接字 文章目录 创建套接字绑定端口号读取数据发送数据聊天框输入框 创建套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);int domain参数&#xff1a;表面要创建套接字的域…