当前位置:网站首页>Convolution和Batch normalization的融合
Convolution和Batch normalization的融合
2022-07-02 22:14:00 【点PY】
理论推算
当前CNN卷积层的基本组成单元标配:Conv + BN +ReLU 三个子模块。但其实在网络的推理阶段,可以将BN层的运算融合到Conv层中,减少运算量,加速推理。本质上是修改了卷积核的参数,在不增加Conv层计算量的同时,略去了BN层的计算量。公式推导如下。
conv层的参数
BN层的参数
假设输入为x,则x->Conv->BN的输出便是:
做个简单的公式变形:
代码实现
在实际使用时,首先要定位conv和bn的位置,根据实际情况进行替换或者删除BN层。在本次实施例中,以开源分割模型库https://github.com/qubvel/segmentation_models.pytorch为案例进行融合实验,对BN层进行了替换。
class Conv2dReLU(nn.Sequential):
def __init__(
self,
in_channels,
out_channels,
kernel_size,
padding=0,
stride=1,
use_batchnorm=True,
):
if use_batchnorm == "inplace" and InPlaceABN is None:
raise RuntimeError(
"In order to use `use_batchnorm='inplace'` inplace_abn package must be installed. "
+ "To install see: https://github.com/mapillary/inplace_abn"
)
conv = nn.Conv2d(
in_channels,
out_channels,
kernel_size,
stride=stride,
padding=padding,
bias=not (use_batchnorm),
)
relu = nn.ReLU(inplace=True)
if use_batchnorm == "inplace":
bn = InPlaceABN(out_channels, activation="leaky_relu", activation_param=0.0)
relu = nn.Identity()
elif use_batchnorm and use_batchnorm != "inplace":
bn = nn.BatchNorm2d(out_channels)
else:
bn = nn.Identity()
super(Conv2dReLU, self).__init__(conv, bn, relu)
from turtle import forward
from torch.fx.experimental.optimization import fuse
import torch
import torch.nn as nn
import time
import segmentation_models_pytorch.base.modules as md
from utils.torchUtils import fuse_conv_and_bn
def fuseModel(model): # fuse model Conv2d() + BatchNorm2d() layers
for m in model.modules():
if isinstance(m, (md.Conv2dReLU)) and isinstance(m[1], (nn.BatchNorm2d)):
m[0] = fuse_conv_and_bn(m[0], m[1]) # update conv
m[1] = nn.Identity()
count += 1
return model
边栏推荐
- Go basic anonymous variable
- ServletContext learning diary 1
- [favorite poems] OK, song
- Eight bit responder [51 single chip microcomputer]
- Solution to boost library link error
- How difficult is it to be high? AI rolls into the mathematics circle, and the accuracy rate of advanced mathematics examination is 81%!
- 抖音实战~点赞数量弹框
- Simple square wave generating circuit [51 single chip microcomputer and 8253a]
- C#中Linq用法汇集
- golang入门:for...range修改切片中元素的值的另类方法
猜你喜欢
Temperature measurement and display of 51 single chip microcomputer [simulation]
解决:exceptiole ‘xxxxx.QRTZ_LOCKS‘ doesn‘t exist以及mysql的my.cnf文件追加lower_case_table_names后启动报错
Win11如何开启目视控制?Win11开启目视控制的方法
Redis 过期策略+conf 记录
Win11系统explorer频繁卡死无响应的三种解决方法
YOLOX加强特征提取网络Panet分析
采用VNC Viewer方式远程连接树莓派
详解Promise使用
"A good programmer is worth five ordinary programmers!"
Application of containerization technology in embedded field
随机推荐
Go basic anonymous variable
力扣刷题(2022-6-28)
Simple square wave generating circuit [51 single chip microcomputer and 8253a]
理想汽车×OceanBase:当造车新势力遇上数据库新势力
基于Pyqt5工具栏按钮可实现界面切换-1
【Redis笔记】压缩列表(ziplist)
Getting started with golang: for Range an alternative method of modifying the values of elements in slices
Tronapi wave field interface - source code without encryption - can be opened twice - interface document attached - packaging based on thinkphp5 - detailed guidance of the author - July 1, 2022 08:43:
Set right click to select vs code to open the file
The use of 8255 interface chip and ADC0809
Connexion à distance de la tarte aux framboises en mode visionneur VNC
[hardware] origin of standard resistance value
Looking at Ctrip's toughness and vision from the Q1 financial report in 2022
海思 VI接入视频流程
潘多拉 IOT 开发板学习(HAL 库)—— 实验3 按键输入实验(学习笔记)
海思调用接口之Makefile配置
Which common ports should the server open
PotPlayer设置最小化的快捷键
Use the scroll bar of souI when using the real window in souI
Editor Caton