【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现

简介: 【GhostNet】复现CVPR2020| 保证模型轻量化的同时,提升网络的性能表现

前言

  近年来,随着深度学习技术的快速发展,越来越多的神经网络架构被提出。其中,GhostNet是一个备受关注的网络架构,其提出的主要目的是在保证模型轻量化的同时,提升网络的性能表现。GhostNet的设计思想独特,引入了ghost module这一新的网络模块,并采用了一系列的优化方法。本篇博客将详细介绍GhostNet的原理、优点以及应用场景,以及其在图像分类任务上的性能表现。

GhostNet

原理

  出于对轻量化神经网络的需求,ghost module采用了“组卷积”和“通道分组”两种技术,可以将输入特征图拆分成两个子特征图,分别进行不同的卷积操作。其中,一个子特征图较小,被称为ghost feature map,另一个子特征图较大,被称为primary feature map。ghost feature map负责提取局部信息,primary feature map负责提取全局信息。

image.png

  最后将两个子特征图合并起来,形成最终的输出特征图。这种方式可以在不增加太多参数和计算复杂度的前提下,提高模型的表现能力。

优点

更轻量化

  GhostNet在保证模型性能的同时,大大减小了模型的体积和参数量,使得模型更加轻量化。这对于在计算资源有限的情况下使用深度学习模型非常重要,例如在嵌入式设备或者移动端设备中部署模型。

更高效

  由于引入了ghost module,GhostNet在一定程度上减少了计算量和内存开销。这使得模型在推理阶段具有更高的速度和更低的能耗。

更好的表现

  GhostNet通过引入新的网络模块和优化方法,可以在保证模型轻量化的前提下,提高模型的表现能力。在图像分类等任务上,GhostNet的表现甚至超过了传统的卷积神经网络。

更适合端到端训练

  GhostNet采用了一种新型的训练方法,称为low-rank decomposition,这种方法可以更好地适应端到端训练。与传统的方法相比,low-rank decomposition可以减少模型的过拟合问题。

性能

ImageNet数据集上的Top-1精度vsFLOPs。

image.png

ImageNet数据集上的Top-1精度vs延迟:

image.png

在当前较为先进的小型网络在ImageNet数据集上的分类精度、权重和flop的比较:

image.png

实现

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)



相关文章
|
4天前
|
机器学习/深度学习 存储 计算机视觉
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-4
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
35 11
|
17小时前
|
机器学习/深度学习 存储 算法
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现(下)
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
12 2
|
19小时前
|
机器学习/深度学习 运维 算法
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
|
1天前
|
存储 NoSQL Linux
Redis入门到通关之Redis5种网络模型详解
Redis入门到通关之Redis5种网络模型详解
|
3天前
|
网络协议 Linux Shell
【linux网络(一)】初识网络, 理解四层网络模型
【linux网络(一)】初识网络, 理解四层网络模型
|
4天前
|
机器学习/深度学习 算法 数据可视化
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-3
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
12 0
|
4天前
|
算法 数据可视化
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-1
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
18 0
|
9天前
|
机器学习/深度学习 数据可视化 Shell
用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化(二)
用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化
32 1
|
9天前
|
机器学习/深度学习 数据采集 数据可视化
用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化(一)
用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化
48 0
|
9天前
|
机器学习/深度学习 数据采集 数据可视化
R语言用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化
R语言用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化
120 7