前言
轻量化网络是指在保证模型精度的前提下,通过一系列优化技术使得模型参数数量大幅减少的深度学习模型。它的诞生主要是为了解决深度学习在移动端等资源受限环境中应用受限的问题。随着近年来深度学习的应用场景不断扩大,轻量化网络也逐渐成为了热门的研究方向,各种轻量化网络层出不穷。
例如MobileNet、ShuffleNet、SqueezeNet等。 这些轻量化网络都采用了一系列优化技术,如深度可分离卷积、通道重排等,可以在保证模型精度的同时大幅减少参数数量和计算量,从而在移动端等资源受限的环境中有更好的应用表现。
初识
SqueezeNet网络
SqueezeNet相比于传统的卷积神经网络使得网络模型在参数量和计算量上都比较小,同时保持较高的准确率。更适合在资源受限的设备上进行部署。
SqueezeNet的设计思路主要有两个关键点:
- 采用了1×1卷积核来降低网络的参数量和计算量;
- 采用了“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: 适合在资源受限的设备上进行部署,例如物联网设备、边缘计算设备等。