RepVGG:一个结构重参数化网络

news2024/11/17 3:35:25

本文来自公众号“AI大道理”

ResNet、DenseNet 等复杂的多分支网络可以增强模型的表征能力,使得训练效果更好。但是多分支的结构在推理的时候效率严重不足。

看起来二则不可兼得。

能否两全其美?

RepVGG通过结构重参数化的方法,在训练的时候使用多分支结构,而在推理的时候多分支结构融合成单路结构,即保证了训练的效果,也提高了推理速度。

1、RepVGG网络结构

ResNet:一个主分支+一个恒等映射分支。

RepVGG:一个主分支+一个 1x1 conv 分支+一个恒等映射分支。

RepVGG 训练的 block 可以表示为:y=x+g(x)+f(x)

多分支训练:

移除 RepVGG-B0 的恒等映射分支/1x1 conv 分支,来看训练模型的效果:

  • 两个分支都移除后,训练模型准确度跌到 72.39%

  • 使用 1x1 分支升到 73.15%

  • 使用恒等映射升到 74.79%

  • 使用 3 个分支升到 75.14%

可见多分支网络结构对模型性能的提升是明显的,在训练阶段采用多分支网络结构是必要的。

单路推理:

更快。推理的时候恒等映射分支计算最快,1*1卷积其次,3*3卷积最慢。

因此,其他两个计算完毕要等待3*3卷积计算。而变为单路推理,明显更快。

更省内存。单路推理只占用一倍的内存,而多路要占用多倍。

更加灵活。单路剪枝方便,而多路困难。


 

2、结构重参数化

结构重参数化就是训练和推理使用不同的结构,但是用同一套参数量。

灵魂的拷问:一般是网络训练出来的参数在推理的时候直接带入同样的网络进行一次计算,从而得出一个推理结果的,怎么能用一套参数带入不同网络呢?

那么结构重参数化是如何实现的呢?

RepVGG将 3 分支网络等价转换,简化成单分支网络。

步骤1:

恒等映射分支可以被看做卷积核为1*1的单位1卷积。

经过这种变换后,就能得到:

  • 1 个 3x3 kernel

  • 2 个 1x1 kernel

  • 3 个 bias vectors

步骤2:

先对卷积 “吸BN”(即将 conv+bn 转换成一个带 bias 的 conv)。

将1*1卷积核边缘补 0,成3*3卷积核。

步骤3:

将三个卷积以中心点为基准相加,将 3 个卷积合并为 1 个。

将 2 个 1x1 kernels 和 1 个 3x3 kernels 相加(边缘补 0),就能得到最终的 3x3 kernel。

总体过程:

结构重参数之后参数减少了,推理变快了。

灵魂的回答:

结构重参数化的实质:训练时的结构对应一组参数,推理时我们想要的结构对应另一组参数;只要能把前者的参数等价转换为后者,就可以将前者的结构等价转换为后者。

3、总结

RepVGG 是为 GPU 和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。

重参数结构的分支融合和吸 BN 操作,显著放大了权重参数分布的标准差。

而异常的权重分布又会产生了过大的网络激活层数值分布,从而进一步导致该层量化损失过大,因此模型精度损失严重。

这也是RepVGG 的推理模型很难使用后量化方法的原因。

 ——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

 

—————————————————————

投稿吧   | 留言吧

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

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

相关文章

2022 年 Kubernetes 高危漏洞盘点

2022 年,Kubernetes继续巩固自己作为关键基础设施领域的地位。从小型到大型组织,它已成为广受欢迎的选择。出于显而易见的原因,这种转变使 Kubernetes 更容易受到攻击。但这还没有结束,开发人员通常将Kubernetes 部署与其他云原生…

【2022.12.18】备战春招Day13——每日一题 + 234. 回文链表 + 139. 单词拆分

【每日一题】1703. 得到连续 K 个 1 的最少相邻交换次数 题目描述 给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动,你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数 输入:nums …

【数据结构】堆(二)——堆排序、TOP-K问题

作者:一个喜欢猫咪的的程序员 专栏:《数据结构》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 堆排序:(以小堆为例) Heapsort函数…

C语言重点解剖关键字要点速记

1.在windows中,双击的本质是运行该程序,就是将程序(.exe)加载到内存当中去。任何程序在被运行之前都必须加载到内存当中去。 2.所有的变量本质都是在内存的某个位置开辟的。变量不能定义在硬盘上,因为变量必须在程序运行的时候才能被开辟&am…

SPRING-了解1

1)最终address: 查找路径比较长,很有趣 JFrog 原始步骤1)进入 spring.io,点击右上角黑色标记边的标记 2)进入 git,找到 Binaries下面的 Spring Framework Artifacts 3)进一步找到Downlaoding a Distribution,下面有 https://repo.spring.io 4)x选择…

牛客SQL每日一题之SQL136 每类试卷得分前3名

文章目录SQL136 每类试卷得分前3名描述示例1输入:输出:答案SQL136 每类试卷得分前3名 描述 现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间)&#x…

C# 中的 Infinity 和 NaN

C# 语言中,对于 int,long 和 decimal 类型的数,任何数除以 0 所得的结果是无穷大,不在 int,long 和 decimal 类型的范围之内,所以计算 6/0 之类的表达式会出错。 但是,double 和 float 类型实际…

Java入门笔记补充

Java基础笔记补充数据类型数据类型整形拓展浮点型拓展字符型拓展类型转换变量变量作用域局部变量实例变量静态变量变量的命名规范数组三种初始化静态初始化动态初始化数组的默认初始化Arrays类内存分析栈 stack:堆 heap:方法区(也是堆):封装继…

卷积神经网络 图像处理,卷积神经网络图片处理

1、在做图像处理时,如何提高识别算法的设计与效果的精度? 得到更多的数据 这无疑是最简单的解决办法,深度学习模型的强大程度取决于你带来的数据。增加验证准确性的最简单方法之一是添加更多数据。如果您没有很多训练实例,这将特…

AllegroBGA如何自动fanout操作指导

AllegroBGA如何自动fanout操作指导 当我们需要给BGA做fanout的时候,逐个pin去fanout是件比较麻烦的事情,下面介绍Allegro中如何自动fanout,以下图BGA为例 具体操作如下 选择Route-Create Fanout 选择Via类型,比如Via10 Via Direction BGA Quadrant Style Pin-via Space…

数字化母婴店,母婴智慧会员管理小程序

会员店想必很多小伙伴都接触过或有所耳闻,会员店的本质是通过好产品、好服务及好内容营造出完整且完美的用户消费体验,虽然纯会员店并不多,但如今越来越多的各行业商家意识到每个流量用户都很重要,需要维护好每个用户,…

18.Django大型项目之用户中心页面

1. 用户中心的搭建 1.1 基础搭建 这里,主要就是基础的页面渲染,使用的也是继承主模板,对其进行修改的方式。就直接看代码吧 1.2 上下文的应用 什么是上下文? 对于上下文,可以理解成一个公用的函数或者类 我们这里使…

Qt使用MSVC2015找不到编译器的解决办法

Qt使用MSVC2015找不到编译器的解决办法 1、问题描述 安装qt前,已安装vscode,构建套件MSVC2015 32/64bit出现红色感叹号,并报错构建套件中未设置编译器 2、解决办法 step1:通过windows SDK工具安装调试器。 工具下载地址:https:/…

244. 谜一样的牛——二分+树状数组

有 n 头奶牛,已知它们的身高为 1∼n 且各不相同,但不知道每头奶牛的具体身高。 现在这 n 头奶牛站成一列,已知第 i 头牛前面有 Ai 头牛比它低,求每头奶牛的身高。 输入格式 第 1 行:输入整数 n。 第 2…n 行&#x…

Linux——组管理和权限管理

Linux组 基本介绍 在Linux中的每个用户必须属于一个组,不能独立于组外,在Linux中每个文件有所有者,所在组,其他组的概念。 所有者 一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。 查…

构造序列(模拟构造)

请你构造一个 01 序列,序列需要满足以下所有要求: 恰好包含 n 个 0 和 m 个 1。不存在两个或两个以上的 0 连续相邻。不存在三个或三个以上的 1 连续相邻。 输入格式 共一行,包含两个整数 n,m。 输出格式 输出共一行,如果存在…

【js记录】递归进行深拷贝时对于Object遍历方法的思考【深浅拷贝+object县官属性介绍+类型判断方法+for...in+for...of】

一、 前言:本文使用的 类型判断方法介绍 通过手写instaceof更好理解其作用及使用 1、 typeof 判断一个实例属于哪种类型 2、 instance 判断一个实例是否属于某种类型let person function(){ } let no new person(); no instanceof person; // true3、 原型…

IT分销商未来在哪里?南京创瑞丰向复合型产品方案商转型

在一个充满不确定性的市场中,思变求新是企业的唯一出路。 诚如IT分销领域,云计算、大数据、人工智能等技术的兴起,加速企业数字化转型的同时,亦对于传统IT分销市场的未来产生了深远影响。过去“搬箱子”、打价格战的方式方法正在…

Python中文件操作(读、写、关闭)

目录 一.什么是文件 二.python文件操作 1.open()打开函数 注意 mode常用的三种基础访问模式 2.读操作相关方法 read()方法: readlines()方法: readline()方法 for…

Linux性能学习(1.1):CPU_CPU缓存

文章目录1 简介2 工作机制3 Cache Line参考资料: 1. https://www.makeuseof.com/tag/what-is-cpu-cache/ 2. https://zhuanlan.zhihu.com/p/80672073 3.CPU Cache 机制以及 Cache miss 4.性能优化方法和技巧 在日常的嵌入式开发中,查看一些SOC的datashe…