当前位置:网站首页>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
边栏推荐
- Implementation of VGA protocol based on FPGA
- Jinglianwen technology's low price strategy helps AI enterprises reduce model training costs
- Eight bit responder [51 single chip microcomputer]
- Start from the bottom structure to learn the customization and testing of FPGA --- Xilinx ROM IP
- Golang common settings - modify background
- golang中new与make的区别
- Makefile configuration of Hisilicon calling interface
- [hardware] origin of standard resistance value
- What experience is there only one test in the company? Listen to what they say
- 基于Pyqt5工具栏按钮可实现界面切换-2
猜你喜欢

"A good programmer is worth five ordinary programmers!"

RuntimeError: no valid convolution algorithms available in CuDNN

理想汽车×OceanBase:当造车新势力遇上数据库新势力

Tiktok actual combat ~ number of likes pop-up box

Detailed explanation and application of merging and sorting

Start from the bottom structure to learn the customization and testing of FPGA --- Xilinx ROM IP

Prometheus deployment

Markdown basic grammar

ADC of stm32

ServletContext learning diary 1
随机推荐
The concepts of terminal voltage, phase voltage and line voltage in FOC vector control and BLDC control are still unclear
Go basic anonymous variable
Connexion à distance de la tarte aux framboises en mode visionneur VNC
[adjustment] postgraduate enrollment of Northeast Petroleum University in 2022 (including adjustment)
[favorite poems] OK, song
C#中Linq用法汇集
Use of recyclerview with viewbinding
门牌制作 C语言
Brief introduction of emotional dialogue recognition and generation
数字图像处理实验目录
【STL源码剖析】仿函数(待补充)
MySQL queries nearby data And sort by distance
Explain promise usage in detail
Go basic constant definition and use
ping域名报错unknown host,nslookup/systemd-resolve可以正常解析,ping公网地址通怎么解决?
CDN acceleration requires the domain name to be filed first
Li Kou brush questions (2022-6-28)
Win11启用粘滞键关闭不了怎么办?粘滞键取消了但不管用怎么解决
Catalogue of digital image processing experiments
Three solutions to frequent sticking and no response of explorer in win11 system