RepVGG:一个结构重参数化网络
本文来自公众号“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大道理”,选择“关注”公众号
—————————————————————
—————————————————————
RepVGG:一个结构重参数化网络的更多相关文章
- java socket传送一个结构体给用C++编写的服务器解析的问题
另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...
- Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)
在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...
- 实现一个简易的Unity网络同步引擎——netgo
实现一个简易的Unity网络同步引擎Netgo 目前GOLANG有大行其道的趋势,尤其是在网络编程方面.因为和c/c++比较起来,虽然GC占用了一部分机器性能,但是出错概率小了,开发效率大大提升,而且 ...
- 最近研究了一个.NET的DHT网络搜索引擎,顺便重新整理了下引擎思路,供大家分享讨论下。
最近研究了一个.NET的DHT网络搜索引擎,顺便重新整理了下引擎思路,供大家分享讨论下.
- 打算写一个《重学Node.js》系列,希望大家多多支持
先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...
- NetworkX一个图论与复杂网络建模工具
NetworkX是一个图论与复杂网络建模工具,采用Python语言开发,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析.仿真建模等工作.(1)NetworkX支持创建简单无向图.有向 ...
- NX二次开发-如何在类外面定义一个结构体
#include <uf.h> #include <uf_obj.h> #include <uf_part.h> using namespace NXOpen; u ...
- 问题:win10缺少一个或多个网络协议
国庆回家,家里电脑连不上网了,诊断给出的结果是“缺少一个或多个网络协议” 网上这类问题提问的不少,回答的方法也是各种各样,一个一个试下来,发现这个方法是可行的. 1.打开设置--网络和Internet ...
- Golang通过反射拼接一个结构体所有字段
golang通过反射拼接一个结构体所有字段 需求 将一个结构体所有字段以"|"连接拼接成字符串 golang 不同类型拼接成string使用Sprintf比较麻烦,如果一个结构体有 ...
- 给大家补充一个结构体的例子:下面TwoNumber就是一个形式上的结构体
给大家补充一个结构体的例子:下面TwoNumber就是一个形式上的结构体: class TwoNumber { int num1; int num2; } public class T ...
随机推荐
- Nextcloud的一些错误提示
Nextcloud的一些错误提示 PHP 内存限制低于建议值 512MB 您可以通过以下步骤增加PHP内存限制: 打开php.ini文件 在终端中输入以下命令打开php.ini文件: bash sud ...
- 动手写了个简单版的ChatGPT的Java版客户端
最近ChatGpt大火,我在年前申请过账号忘了下确实强大. 作为Java程序猿社畜就尝试写了个Java版本的简易版客户端. 源码地址:https://github.com/Grt1228/chatgp ...
- No.2.6
vw/vh:(能够使用vw单位设置网页元素的尺寸) 相对单位 相对视口的尺寸计算结果 vw:viewport width(1vw=1/100视口宽度) vh:viewport height(1vh=1 ...
- C# Post调用接口并传递json参数
1 public string Post(string Url, string jsonParas) 2 { 3 string strURL = Url; 4 //创建一个HTTP请求 5 HttpW ...
- flannel 关闭SNAT
flannel 关闭SNAT 默认情况下,flannel 访问集群外网络是通过 SNAT 成宿主机 ip 方式,在一些金融客户环境中为了能实现防火墙规则,需要直接针对 POD ip 进行进行规则配置, ...
- 不用VS,使用NET 7.0 SDK (v7.0.101)编程c#控制台应用程序方法
摘要:如果没有vs环境,也可以编程c#控制台应用程序学习c#,方法步骤有下面几个步骤. 1.下载NET 7.0 SDK (v7.0.101)安装 网址https://dotnet.microsoft. ...
- vue 学习 css第四天
一.css背景属性 可以给页面元素添加背景样式. 背景属性(background)可以设置. 1.背景颜色. 2.背景图片. 3.背景平铺. 4.背景图片位置 5.背景图像固定 1.背景颜色(back ...
- ASP.NET Core http请求内容过大, IIS服务器 返回 Request Too Long 解决方案
1.修改web.config文件内容如下: <?xml version="1.0" encoding="utf-8"?> <configura ...
- cisco的telnet远程登入
Cisco配置telnet登入 拓扑图: IP地址表: 设备 IP地址 PC0 192.168.1.1 Switch0 vlan1:192.168.1.254 1.不需要用户的telnet登入 Swi ...
- windows下解决getAddressInfo Failed的一种办法
从九点到现在,解决完这个问题就四点了,其实不难,只是第一次遇到和我太菜. 就是管理员身份打开命令行然后输入ipconfig /flushdns,作用是刷新dns解析缓存,这还不够,如果只做这一步,重启 ...