REVGG:“双面”的神经网络

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值