一
1.为什么提出repvgg
现代卷积神经网络越来越复杂,resnet 等用多分支结构网络各个分支的结果需要保存,直到最后一步融合,才能把各分支显存释放,占用额外内存,速度变慢
2.独特之处
(1)训练时采用多分支结构,推理时只有单一线路,没有分支
(2)主体只使用3*3卷积,激活函数只用relu
(3)对训练模型参数重参数化得到推理模型参数
3.作者受到的启发
(1)vgg 架构的高速、节省内存
(2)resnet 等分支结构网络在训练时效果更好
(3)现在的硬件针对3x3卷积有深度的优化
4.简单阐述repvgg
训练时采用多分支结构,模型训练好后,用数学方法将多分支等价转化为单线结构,用于推理
5.缺点
repvgg 为gpu和专用硬件设计,不怎么考虑参数数量,对于低能耗设备而言不如其他一些模型受欢迎
二
1.复现设计部分展示
对每一块进行定义,注意区分训练和推理
class Repblk(nn.Module):
def __init__(self, input_channels, num_channels, strides=1, is_first_layer=False, deploy=False):
super().__init__()
self.dpl = deploy
if deploy == False:
self.is_first_layer = is_first_layer
self.conv_k3 = nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1, stride=strides, bias=False)
self.conv_k1 = nn.Conv2d(input_channels, num_channels, kernel_size=1, padding=0, stride=strides, bias=False)
self.bn1 = nn.BatchNorm2d(num_channels)
self.bn2 = nn.BatchNorm2d(num_channels)
if is_first_layer == False:
self.bn3 = nn.BatchNorm2d(num_channels)
else:
self.conv_dpl = nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1, stride=strides)
def forward(self, X):
if self.dpl == False:
Y = self.bn1(self.conv_k3(X)) + self.bn2(self.conv_k1