经典的卷积主干网络

目录

前言

一、ResNet

二、MobileNet

三、ShuffleNet

前言

在深度学习中,主干网络(backbone network)是指构成整个神经网络架构中的核心部分,负责提取输入数据的特征表示。主干网络通常由多个层次或模块组成,用于逐渐提取数据中的抽象特征,以便用于后续任务,如分类、检测、分割等。


一、ResNet

原文链接:https://arxiv.org/pdf/1512.03385.pdf

ResNet(Residual Network)是深度学习中一种非常流行的卷积神经网络架构。它通过引入残差连接解决了深层网络训练过程中的梯度消失和表达能力限制的问题。

ResNet 的核心思想是在网络中引入残差模块(residual block),每个残差模块包含了跳跃连接,将输入直接添加到输出中,形成残差。这样,即使网络层数加深,信息可以直接从前面的层流向后面的层,有效地缓解了梯度消失问题,并提高了网络的表达能力。

以下是residual block的简单代码实现

class ResidualBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(ResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1)

    def forward(self, x):
        out = self.conv1(x)
        out = self.relu(out)
        out = self.conv2(out)
        out += x  # 残差连接
        out = self.relu(out)
        return out

二、MobileNet

原文链接:https://arxiv.org/pdf/1704.04861.pdf

MobileNet是一种由Google开发的轻量级卷积神经网络架构,专门设计用于移动设备和嵌入式系统,旨在在计算资源有限的环境下实现高效的图像分类和目标识别。它采用了一种称为深度可分离卷积(depthwise separable convolution)的特殊卷积操作,如上图(b)和(c)所示,它将标准卷积分解为两个步骤:深度卷积和逐点卷积。

深度卷积对输入的张量数据进行逐通道的映射,相较于普通卷积的全局通道映射可以有效地减少计算复杂度,但是这种映射之间不存在通道间的信息交互,影响了全局的信息流通,因此需要逐点卷积来实现通道间的信息交换。

逐点卷积通过1x1的标准卷积实现,通过小卷积核的全局通道映射解决了深度卷积存在的映射信息不交互问题,同时也不会引入过多的计算量。

深度可分离卷积的pytorch简单实现如下

class Depthwise_Separable_Conv(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, padding=1):
        super(Depthwise_Separable_Conv, self).__init__()
        self.depthwise_conv = nn.Sequential(nn.Conv2d(in_channels, in_channels, kernel_size=kernel_size, padding=padding, groups=in_channels),
                                            nn.BatchNorm2d(in_channels),
                                            nn.ReLU(inplace=True))
        self.pointwise_conv = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=1),
                                            nn.BatchNorm2d(out_channels),
                                            nn.ReLU(inplace=True))

    def forward(self, x):
        x = self.depthwise_conv(x)
        x = self.pointwise_conv(x)

        return x

三、ShuffleNet

原文链接:https://arxiv.org/pdf/1707.01083.pdf

 ShuffleNet 是一种轻量级的神经网络架构,它的核心思想是通过引入分组卷积和通道混洗操作来减少计算复杂度。分组卷积将输入通道分成多个组,并在每个组内进行独立的卷积操作,然后将各组的输出合并。通道混洗操作则通过将通道重新排列为不同组之间交错的方式来增加信息流动性,以便信息能够在不同的组之间交互。

类似的结构有Google团队提出的深度可分离卷积(depthwise separable convolution),相较于深度可分离卷积采用的1x1卷积信息交互,ShuffleNet的通道混洗计算复杂度更低,更有利于边缘设备上的部署。

通道混洗操作的代码实现如下

class ChannelShuffle(nn.Module):
    def __init__(self, groups):
        super(ChannelShuffle, self).__init__()
        self.groups = groups

    def forward(self, x):
        b, c, h, w = x.size()
        c_per_groups = c // self.groups
        x = x.view(b, self.groups, c_per_groups, h, w)  # 将输入张量分成多个组
        x = x.transpose(1, 2).contiguous()  # 交换组内通道的顺序
        x = x.view(b, c, h, w)  # 重新展平张量

        return x

四、RepVGG

原文链接:https://arxiv.org/pdf/2101.03697.pdf

待续

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值