前言
近年来,随着深度学习技术的快速发展,越来越多的神经网络架构被提出。其中,GhostNet是一个备受关注的网络架构,其提出的主要目的是在保证模型轻量化的同时,提升网络的性能表现。GhostNet的设计思想独特,引入了ghost module这一新的网络模块,并采用了一系列的优化方法。本篇博客将详细介绍GhostNet的原理、优点以及应用场景,以及其在图像分类任务上的性能表现。
GhostNet
原理
出于对轻量化神经网络的需求,ghost module采用了“组卷积”和“通道分组”两种技术,可以将输入特征图拆分成两个子特征图,分别进行不同的卷积操作。其中,一个子特征图较小,被称为ghost feature map,另一个子特征图较大,被称为primary feature map。ghost feature map负责提取局部信息,primary feature map负责提取全局信息。
最后将两个子特征图合并起来,形成最终的输出特征图。这种方式可以在不增加太多参数和计算复杂度的前提下,提高模型的表现能力。
优点
更轻量化
GhostNet在保证模型性能的同时,大大减小了模型的体积和参数量,使得模型更加轻量化。这对于在计算资源有限的情况下使用深度学习模型非常重要,例如在嵌入式设备或者移动端设备中部署模型。
更高效
由于引入了ghost module,GhostNet在一定程度上减少了计算量和内存开销。这使得模型在推理阶段具有更高的速度和更低的能耗。
更好的表现
GhostNet通过引入新的网络模块和优化方法,可以在保证模型轻量化的前提下,提高模型的表现能力。在图像分类等任务上,GhostNet的表现甚至超过了传统的卷积神经网络。
更适合端到端训练
GhostNet采用了一种新型的训练方法,称为low-rank decomposition,这种方法可以更好地适应端到端训练。与传统的方法相比,low-rank decomposition可以减少模型的过拟合问题。
性能
ImageNet数据集上的Top-1精度vsFLOPs。
ImageNet数据集上的Top-1精度vs延迟:
在当前较为先进的小型网络在ImageNet数据集上的分类精度、权重和flop的比较:
实现
ini
复制代码
import torch import torch.nn as nn import math class GhostModule(nn.Module): def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True): super(GhostModule, self).__init__() self.oup = oup init_channels = math.ceil(oup / ratio) new_channels = init_channels*(ratio-1) self.primary_conv = nn.Sequential( nn.Conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=False), nn.BatchNorm2d(init_channels), nn.ReLU(inplace=True) if relu else nn.Sequential(), ) self.cheap_operation = nn.Sequential( nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=False), nn.BatchNorm2d(new_channels), nn.ReLU(inplace=True) if relu else nn.Sequential(), ) def forward(self, x): x1 = self.primary_conv(x) x2 = self.cheap_operation(x1) out = torch.cat([x1,x2], dim=1) return out[:,:self.oup,:,:] if __name__ == "__main__": x = torch.zeros(1, 3, 640, 640) model = GhostModule(inp=3, oup=64) y = model(x) print(y.shape)