【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天前
|
存储 安全 光互联
|
5天前
|
机器学习/深度学习 数据可视化 算法
R语言神经网络与决策树的银行顾客信用评估模型对比可视化研究
R语言神经网络与决策树的银行顾客信用评估模型对比可视化研究
|
5天前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言神经网络模型金融应用预测上证指数时间序列可视化
R语言神经网络模型金融应用预测上证指数时间序列可视化
|
5天前
|
机器学习/深度学习 数据可视化 算法
SPSS Modeler决策树和神经网络模型对淘宝店铺服装销量数据预测可视化|数据分享
SPSS Modeler决策树和神经网络模型对淘宝店铺服装销量数据预测可视化|数据分享
|
5天前
|
监控 网络协议 安全
计算机网络概述及 参考模型
计算机网络概述及 参考模型
|
11天前
|
机器学习/深度学习 PyTorch 算法框架/工具
Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
Python用GAN生成对抗性神经网络判别模型拟合多维数组、分类识别手写数字图像可视化
|
11天前
|
机器学习/深度学习 算法 数据可视化
数据报告分享|WEKA贝叶斯网络挖掘学校在校人数影响因素数据分类模型
数据报告分享|WEKA贝叶斯网络挖掘学校在校人数影响因素数据分类模型
|
12天前
|
分布式计算 Hadoop 测试技术
|
12天前
|
分布式计算 Hadoop 测试技术
|
12天前
|
分布式计算 Hadoop 测试技术
Hadoop节点网络性能的带宽测试
【4月更文挑战第23天】
24 1