倒残差结构

  倒残差结构(Inverted Residual)是一种在轻量级卷积神经网络中常用的设计模块,旨在提高模型的效率和性能。它最早由MobileNetV2引入,并在后续的网络中得到了广泛应用,包括MobileNetV3等。倒残差结构的核心思想是将传统的残差结构(Residual Block)进行变种,以适应轻量级网络的特点。
  传统的残差结构中,输入特征图经过一系列卷积操作后,与原始输入相加得到输出。而在倒残差结构中,我们首先对输入特征图进行一个轻量级的扩张卷积(expand convolution),然后再进行一个深度可分离卷积(depthwise separable convolution),最后再通过一个点卷积(pointwise convolution)将通道数降回来,最终与原始输入特征图相加得到输出。
  倒残差结构的主要创新点在于两个方面:
  轻量级扩张卷积(Expand Convolution): 在倒残差结构中,首先使用一个具有少量输出通道的卷积操作来扩张输入特征图的通道数。这个扩张卷积的目的是引入更多的特征表达,以供后续的深度可分离卷积提取信息。
  深度可分离卷积(Depthwise Separable Convolution): 在扩张卷积之后,使用深度可分离卷积进行特征提取。深度可分离卷积将卷积操作分为两步:深度卷积(depthwise convolution)和点卷积(pointwise convolution)。深度卷积通过对每个通道分别进行卷积操作,从而减少了计算量。而点卷积则用来将通道数降回来,同时引入非线性变换。
  这种设计的意义在于,倒残差结构通过在通道扩张后再进行深度可分离卷积,将计算成本降低到了较低的程度,从而在轻量级网络中实现了高效的特征提取。此外,通过在通道扩张卷积后添加点卷积,还可以引入非线性变换,增强网络的表达能力。
  以下是一个更详细的PyTorch代码示例:

import torch
import torch.nn as nn
from torchsummary import summary

# 3、倒残差结构
class ConvBNReLU(nn.Sequential):
    def __init__(self, in_channel, out_channel, kernel_size=3, stride=1, groups=1):
        padding = (kernel_size - 1) // 2
        super(ConvBNReLU, self).__init__(
            nn.Conv2d(in_channel, out_channel, kernel_size, stride, padding, groups=groups, bias=False),
            nn.BatchNorm2d(out_channel),
            nn.ReLU(inplace=True)
        )


class InvertedResidual(nn.Module):
    def __init__(self, in_channel, out_channel, stride, expand_ratio):
        super(InvertedResidual, self).__init__()
        hidden_channel = in_channel * expand_ratio#expand_ratio:扩展因子
        self.use_shortcut = stride == 1 and in_channel == out_channel
        layers = []
        if expand_ratio != 1:
            layers.append(ConvBNReLU(in_channel, hidden_channel, kernel_size=1))#hxwxk-->hxwx(tk)
        layers.extend([#layers.extend() 是 Python 中的列表方法,用于在一个列表的末尾一次性添加另一个可迭代对象中的所有元素到该列表中。
                ConvBNReLU(hidden_channel, hidden_channel, kernel_size=stride, groups=hidden_channel),#hxwx(tk)-->(h/s)x(w/s)x(tk)
                nn.Conv2d(hidden_channel, out_channel, kernel_size=1, bias=False),#(h/s)x(w/s)x(tk)-->(h/s)x(w/s)xk'
                nn.BatchNorm2d(out_channel)
            ])

        self.conv = nn.Sequential(*layers)

    def forward(self, x):
        if self.use_shortcut:
            x = x + self.conv(x)
            return x
        else:
            x = self.conv(x)
            return x


if __name__ == '__main__':
    model=InvertedResidual(3,64,1,6)
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model.to(device)
    input_tensor=torch.randn(1,3,224,224).to(device)
    input_tensor1 = (3, 224, 224)
    output_tensor=model(input_tensor)
    print(output_tensor.shape)

    print("InvertedResidual:")
    summary(model, input_tensor1)

  以上代码详细展示了如何使用PyTorch构建一个倒残差结构的MobileNetV2模型。您可以根据实际需要进行调整和扩展。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Make_magic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值