【轻量化网络】初识:SqueezeNet网络&MobileNet网络& ShuffleNet网络

简介: 【轻量化网络】初识:SqueezeNet网络&MobileNet网络& ShuffleNet网络

前言

   轻量化网络是指在保证模型精度的前提下,通过一系列优化技术使得模型参数数量大幅减少的深度学习模型。它的诞生主要是为了解决深度学习在移动端等资源受限环境中应用受限的问题。随着近年来深度学习的应用场景不断扩大,轻量化网络也逐渐成为了热门的研究方向,各种轻量化网络层出不穷。

   例如MobileNet、ShuffleNet、SqueezeNet等。 这些轻量化网络都采用了一系列优化技术,如深度可分离卷积、通道重排等,可以在保证模型精度的同时大幅减少参数数量和计算量,从而在移动端等资源受限的环境中有更好的应用表现。

初识

SqueezeNet网络

  SqueezeNet相比于传统的卷积神经网络使得网络模型在参数量计算量上都比较小,同时保持较高的准确率。更适合在资源受限的设备上进行部署。

  SqueezeNet的设计思路主要有两个关键点:

  1. 采用了1×1卷积核来降低网络的参数量和计算量;
  2. 采用了“squeeze-and-excitation”模块来提高网络的表示能力。

  具体来说,SqueezeNet中的大多数卷积层都采用了1×1卷积核,这种卷积核的参数量较少,可以在不增加计算量的前提下降低网络的参数量。而“squeeze-and-excitation”模块则通过对不同通道的特征进行压缩和激励,进一步提高了网络的表示能力。

python

复制代码

import torch
import torch.nn as nn
import torch.nn.functional as F
class SEBlock(nn.Module):
    def __init__(self, in_channels, reduction_ratio=16):
        super(SEBlock, self).__init__()
        self.avgpool = nn.AdaptiveAvgPool2d(1)
        self.fc1 = nn.Linear(in_channels, in_channels // reduction_ratio)
        self.fc2 = nn.Linear(in_channels // reduction_ratio, in_channels)
        
    def forward(self, x):
        b, c, _, _ = x.size()
        # 使用全局平均池化操作对特征进行压缩
        y = self.avgpool(x).view(b, c)
        # 通过两层全连接层对特征进行激励
        y = F.relu(self.fc1(y))
        y = torch.sigmoid(self.fc2(y))
        # 将激励系数乘回原始特征
        y = y.view(b, c, 1, 1)
        return x * y

MobileNet网络

  MobileNet由Google于2017年提出,主要用于在移动设备等资源受限的环境中进行图像分类和目标检测等任务。MobileNet的特点在于,通过使用深度可分离卷积全局平均池化等技术,大幅减少了网络的参数数量和计算量,从而在保证模型精度的前提下,可以在移动设备等低功耗场景下高效地进行图像识别任务。

  深度可分离卷积将传统卷积操作分成深度卷积逐点卷积两步,分别处理空间信息和通道信息,从而减少了参数数量和计算量。线性整流单元(ReLU)则可以增强网络的非线性表达能力。

ini

复制代码

import torch
import torch.nn as nn
def conv_bn(inp, oup, stride = 1):
    return nn.Sequential(
        nn.Conv2d(inp, oup, 3, stride, 1, bias=False),
        nn.BatchNorm2d(oup),
        nn.ReLU6(inplace=True)
    )
    
def conv_dw(inp, oup, stride = 1):
    return nn.Sequential(
        # part1
        nn.Conv2d(inp, inp, 3, stride, 1, groups=inp, bias=False),
        nn.BatchNorm2d(inp),
        nn.ReLU6(inplace=True),
        # part2
        nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
        nn.BatchNorm2d(oup),
        nn.ReLU6(inplace=True),
    )

  MobileNet中另一个重要的技术是全局平均池化,它可以将整个特征图转化为一个数,从而减少了参数数量和计算量。同时,全局平均池化也可以降低过拟合的风险,提高模型的泛化能力。

ShuffleNet网络

  ShuffleNet与MobileNet等轻量化网络不同,ShuffleNet的主要特点在于采用了通道重排等技术,以更高效地利用计算资源和减少信息流量。

  ShuffleNet的主要结构由逐层组合的ShuffleNet块(ShuffleNet Unit)构成。每个ShuffleNet块主要包括分组卷积通道重排逐点卷积(pointwise convolution)三个步骤。其中,分组卷积可以将卷积操作分为多个小组进行,减少了参数数量和计算量。通道重排则将特征通道重新排列,使得不同的通道之间可以相互交流,提高了信息流动性。逐点卷积则可以对通道上的信息进行整合。

ini

复制代码

import torch.nn.functional as F
def channel_shuffle(inputs, num_groups):
    # 获取输入的形状和通道数
    batch_size, num_channels, height, width = inputs.size()
    
    # 将输入张量按通道数分成 num_groups 组
    channels_per_group = num_channels // num_groups
    input_groups = inputs.view(batch_size, num_groups, channels_per_group, height, width)
    
    # 转置第一和第二维,并合并前两维
    input_groups = input_groups.transpose(1, 2).contiguous()
    input_groups = input_groups.view(batch_size, -1, height, width)
    
    return input_groups

  ShuffleNet还引入了两种类型的ShuffleNet块,即ShuffleNet V1和ShuffleNet V2。ShuffleNet V1采用的是分组卷积和通道重排的方式,而ShuffleNet V2则引入了更加复杂的结构,包括逐通道卷积(depthwise convolution)、通道拆分(channel split)和逐点卷积等。

  与其他轻量化网络相比,ShuffleNet的优势在于,通过通道重排技术可以减少信息流量和计算量,从而在保证模型精度的同时提高了计算效率。

总结

  SqueezeNet、MobileNet和ShuffleNet是三种轻量化卷积神经网络,具有较小的参数量和计算量,适合在资源受限的设备上进行部署。它们都采用了不同的设计策略,以实现轻量化和高效的特点。

SqueezeNet: 它适合在资源受限的环境下进行部署,例如移动设备、物联网设备等。

MobileNet: 适合在移动端进行部署,例如手机、平板等。

ShuffleNet: 适合在资源受限的设备上进行部署,例如物联网设备、边缘计算设备等。


相关文章
|
3月前
|
机器学习/深度学习 计算机视觉 网络架构
【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现
【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现
54 0
【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现
|
3月前
|
机器学习/深度学习 存储 算法
【轻量化网络】概述网络进行轻量化处理中的:剪枝、蒸馏、量化
【轻量化网络】概述网络进行轻量化处理中的:剪枝、蒸馏、量化
66 0
|
3月前
|
机器学习/深度学习 算法 PyTorch
python手把手搭建图像多分类神经网络-代码教程(手动搭建残差网络、mobileNET)
python手把手搭建图像多分类神经网络-代码教程(手动搭建残差网络、mobileNET)
48 0
|
3月前
|
机器学习/深度学习 存储 算法
【轻量化:实操】动手实现神经网络中的裁枝操作(附演示代码&yolo系列)
【轻量化:实操】动手实现神经网络中的裁枝操作(附演示代码&yolo系列)
48 1
|
3月前
|
机器学习/深度学习 Go Python
【轻量化网络】实战:更改SqueezeNet网络&MobileNet网络& ShuffleNet网络输出替换yolo的backbone部分
【轻量化网络】实战:更改SqueezeNet网络&MobileNet网络& ShuffleNet网络输出替换yolo的backbone部分
46 0
|
11天前
|
网络协议 算法 Linux
【Linux】深入探索:Linux网络调试、追踪与优化
【Linux】深入探索:Linux网络调试、追踪与优化
|
1天前
|
网络协议 Java Linux
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
7 0
|
1天前
|
存储 网络协议 算法
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
6 0
|
1天前
|
网络协议 算法 Linux
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
7 0
|
1天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
7 0