GhostNet学习记录:

GHostNet网络最通俗易懂的解读【不接受反驳】 如下图所示,是由ResNet-50中的第一个残差块生成的某些中间特征图的可视化。从图中我们可以看出,这里面有很多特征图是具有高度相似性的(在图中分别用不同的颜色示意),换句话说,**就是存在许多的冗余特征图。,即每组的channel数量为1),尽管形式上两者有比较大的差别:分组卷积只进行一次卷积操作即可,而深度可分离卷积需要进行两次——先。之所以在写在前面中提到,本文的题目一定要先是分组卷积再是深度可分离卷积,因为在我看来后者是前者的极端情况(分组卷积的。第二次卷积输出即为深度可分离卷积的输出。 阅读详情

简单的记录一下对ghostnet的学习。

作者大大自己写的文章:CVPR 2020:华为GhostNet,超越谷歌MobileNet,已开源 - 知乎 (zhihu.com)

1、要解决的问题:

        作者提出,在一个训练好的神经网络中,会存在很多的冗余特征,如下图(图出自论文),而这些冗余的特征可以通过一些廉价的操作从别的特征图变换中得到。因此作者的想法是,通过卷积得到一部分的特征,然后通过一些廉价的操作从这些特征图中得到冗余的特征。

2、ghost卷积:

卷积过程:

(1)先通过卷积生成一部分的特征图。

(2)对每个通道通过廉价的线性变换(其实就是对每个通道进行一次卷积,等价于深度卷积)。

(3)将第一步生成的特征图与第二步生成的特征图拼接到一起。

3、ghost bottleneck:

 (1)stride = 1的情况:

        当stride=1的时候,不进行下采样,特征图的宽高保持不变。这一部分思想类似mobilenetV2,先通过一个Ghost module用作扩展层,增加特征的通道数,扩展出冗余的特征,这是为了防止低维度的特征在ReLU激活的时候造成信息丢失。经过ReLU激活之后使用一个Ghost module降低特征维度,减少计算量。

(1)stride = 2的情况:

        当stride=2的时候,对特征进行下采样。两个Ghost module作用和stride=1的时候是相同的,除此之外在两个Ghost module之间加入一个stride=2的DWConv,实现下采样的功能。

代码如下:

"""
Creates a GhostNet Model as defined in:
GhostNet: More Features from Cheap Operations By Kai Han, Yunhe Wang, Qi Tian, Jianyuan Guo, Chunjing Xu, Chang Xu.
https://arxiv.org/abs/1911.11907
Modified from https://github.com/d-li14/mobilenetv3.pytorch
"""
import torch
import torch.nn as nn
import math


__all__ = ['ghost_net']


def _make_divisible(v, divisor, min_value=None):
    """
    This function is taken from the original tf repo.
    It ensures that all layers have a channel number that is divisible by 8
    It can be seen here:
    https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py
    """
    if min_value is None:
        min_value = divisor
    new_v = max(min_value, int(v + divisor / 2) // divisor * divisor)
    # Make sure that round down does not go down by more than 10%.
    if new_v < 0.9 * v:
        new_v += divisor
    return new_v


class SELayer(nn.Module):
    def __init__(self, channel, reduction=4):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
                nn.Linear(channel, channel // reduction),
                nn.ReLU(inplace=True),
                nn.Linear(channel // reduction, channel),        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        y = torch.clamp(y, 0, 1)
        return x * y


def depthwise_conv(inp, oup, kernel_size=3, stride=1, relu=False):
    return nn.Sequential(
        nn.Conv2d(inp, oup, kernel_size, stride, kernel_size//2, groups=inp, bias=False),
        nn.BatchNorm2d(oup),
        nn.ReLU(inplace=True) if relu else nn.Sequential(),
    )

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,:,:]


class GhostBottleneck(nn.Module):
    def __init__(self, inp, hidden_dim, oup, kernel_size, stride, use_se):
        super(GhostBottleneck, self).__init__()
        assert stride in [1, 2]

        self.conv = nn.Sequential(
            # pw
            GhostModule(inp, hidden_dim, kernel_size=1, relu=True),
            # dw
            depthwise_conv(hidden_dim, hidden_dim, kernel_size, stride, relu=False) if stride==2 else nn.Sequential(),
            # Squeeze-and-Excite
            SELayer(hidden_dim) if use_se else nn.Sequential(),
            # pw-linear
            GhostModule(hidden_dim, oup, kernel_size=1, relu=False),
        )

        if stride == 1 and inp == oup:
            self.shortcut = nn.Sequential()
        else:
            self.shortcut = nn.Sequential(
                depthwise_conv(inp, inp, kernel_size, stride, relu=False),
                nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
                nn.BatchNorm2d(oup),
            )

    def forward(self, x):
        return self.conv(x) + self.shortcut(x)


class GhostNet(nn.Module):
    def __init__(self, cfgs, num_classes=1000, width_mult=1.):
        super(GhostNet, self).__init__()
        # setting of inverted residual blocks
        self.cfgs = cfgs

        # building first layer
        output_channel = _make_divisible(16 * width_mult, 4)
        layers = [nn.Sequential(
            nn.Conv2d(3, output_channel, 3, 2, 1, bias=False),
            nn.BatchNorm2d(output_channel),
            nn.ReLU(inplace=True)
        )]
        input_channel = output_channel

        # building inverted residual blocks
        block = GhostBottleneck
        for k, exp_size, c, use_se, s in self.cfgs:
            output_channel = _make_divisible(c * width_mult, 4)
            hidden_channel = _make_divisible(exp_size * width_mult, 4)
            layers.append(block(input_channel, hidden_channel, output_channel, k, s, use_se))
            input_channel = output_channel
        self.features = nn.Sequential(*layers)

        # building last several layers
        output_channel = _make_divisible(exp_size * width_mult, 4)
        self.squeeze = nn.Sequential(
            nn.Conv2d(input_channel, output_channel, 1, 1, 0, bias=False),
            nn.BatchNorm2d(output_channel),
            nn.ReLU(inplace=True),
            nn.AdaptiveAvgPool2d((1, 1)),
        )
        input_channel = output_channel

        output_channel = 1280
        self.classifier = nn.Sequential(
            nn.Linear(input_channel, output_channel, bias=False),
            nn.BatchNorm1d(output_channel),
            nn.ReLU(inplace=True),
            nn.Dropout(0.2),
            nn.Linear(output_channel, num_classes),
        )

        self._initialize_weights()

    def forward(self, x):
        x = self.features(x)
        x = self.squeeze(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()


def ghost_net(num_classes=1000):
    """
    Constructs a GhostNet model
    """
    cfgs = [
        # k, t, c, SE, s
        [3,  16,  16, 0, 1],
        [3,  48,  24, 0, 2],
        [3,  72,  24, 0, 1],
        [5,  72,  40, 1, 2],
        [5, 120,  40, 1, 1],
        [3, 240,  80, 0, 2],
        [3, 200,  80, 0, 1],
        [3, 184,  80, 0, 1],
        [3, 184,  80, 0, 1],
        [3, 480, 112, 1, 1],
        [3, 672, 112, 1, 1],
        [5, 672, 160, 1, 2],
        [5, 960, 160, 0, 1],
        [5, 960, 160, 1, 1],
        [5, 960, 160, 0, 1],
        [5, 960, 160, 1, 1]
    ]
    model = GhostNet(cfgs, num_classes=num_classes)
    return model


if __name__=='__main__':
    model = ghost_net(num_classes=10)
    input = torch.randn(1,3,224,224)
    out = model(input)
    print(out.shape)

即插即用的涨点模块之变体卷积(Ghost卷积)详解及代码,可应用于检测、分割、分类等各种算法领域 来源:CVPR2020官方代码:https://github.com/huawei-noah/ghostnetGhost 模块是一种针对卷积神经网络(CNN)的创新设计,特别适用于嵌入式设备,这些设备通常具有有限的内存和计算资源。Ghost 模块的核心思想是利用已有的特征图(feature maps)通过低成本的线性变换生成更多的“幽灵”特征图(ghost feature maps),从而提高网络的计算效率。 阅读详情

相关推荐

轻量级网络GhostNet--对卷积的新设计解决特征图冗余的问题

论文地址:华为诺亚方舟实验室 2020 CVPR 《GhostNet: More Features from Cheap Operations》 该论文提供了一个全新的Ghost模块,旨在通过廉价操作生成更多的特征图。基于一组原始的特征图,作者应用一系列线性变换,以很小的代价生成许多能从原始特征发掘所需信息的“Ghost”特征图(Ghost feature maps)。该Ghost模块即插即用,通过堆叠Ghost模块得出Ghost bottleneck,进而搭建轻量级神经网络——GhostNet。

panghuzhenbang的博客 5913

轻量级网络Ghostnet(GhostConv(幻影卷积)、Ghost BottleNeck)详解

该论文提供了一个全新的Ghost模块,旨在通过廉价操作生成更多的特征图。基于一组原始的特征图,作者应用一系列线性变换,以很小的代价生成许多能从原始特征发掘所需信息的“Ghost”特征图(Ghost feature maps)。该Ghost模块即插即用,通过堆叠Ghost模块得出Ghost bottleneck,进而搭建轻量级神经网络——GhostNet。

weixin_43960370的博客 4万+

GhostNet架构复现--CVPR2020

由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难。特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究。本文提出了一种新颖的 Ghost 模块,可以从廉价的操作中生成更多的特征图。基于一组内在特征图,我们应用一系列成本低廉的线性变换来生成许多ghost特征图,这些特征图可以充分揭示内在特征的信息。所提出的 Ghost 模块可以作为一个即插即用的组件来升级现有的卷积神经网络。

冲出仁川,走出马德里,故事还会再继续 1618

图像处理-20241101

软池化,ghost卷积,超参数化卷积,注意力机制,csp,letterBox

zxjiaya的博客 1693

防患于未然:检测GhostNet攻击的策略

防患于未然:检测GhostNet攻击的策略 1.背景介绍 1.1 网络安全形势严峻 在当今互联网时代,网络安全威胁与日俱增。黑客、网络犯罪分子和一些国家的网络间谍活动使网络空间充满了各种各样的风险和挑战。无论是个人电脑、企业内部网络

AI架构师小马 1316

多个yolo模型对比融合创新CBAM注意力集成GhostNet实验停车位线识别检测

因此我们将车位角点、车位线和车位占用情况等多种特征相结合,并将车位线抽象为角点间的线段,以避免车位线形态的影响,从而在复杂环境下实现高准确性且支持多目标检测的车位线识别。同时,基于轻量化设计原则,我们对深度学习模型的网络结构进行优化,引入Convolutional Block Attention Module(CBAM)注意力机制模块,优化损失函数,提高车位识别精度,引入GhostNet通过生成更为紧凑的‘幽灵特征’(Ghost Features),减少冗余计算,减少模型的算力消耗。源码获取点击末尾名片。

931

神经网络学习小记录60——Pytorch GhostNet模型的复现详解

神经网络学习小记录60——Pytorch GhostNet模型的复现详解学习前言什么是GhostNet模型源码下载GhostNet模型的实现思路1、Ghost Module2、Ghost Bottlenecks3、Ghostnet的构建GhostNet的代码构建1、模型代码的构建2、Yolov4上的应用 学习前言 GhostNet是华为诺亚方舟实验室提出来的一个非常有趣的网络,我们一起来学习一下。 什么是GhostNet模型 2020年,华为新出了一个轻量级网络,命名为GhostNet。 在优秀CNN模型

Bubbliiiing的学习小课堂 2万+

DexProtector内存态匿名段检测绕过与dex重组技术

Dex文件是Android应用的核心执行单元,其结构规范(如header_item、class_def_item、code_item)决定了运行时加载与解析的底层逻辑。DexProtector通过将dex数据拆解为多个无文件名、受保护的内存匿名段(如[anon:dp_header]、[anon:dp_code]),规避传统基于文件特征或标准加载路径的检测机制。该策略依赖Android mmap内存管理与ART虚拟机对dex结构的刚性要求,形成可被观测的布局规律。理解其内存态组织原理,结合权限/大小/命名/内

weixin_30855761的博客 686

神经网络学习小记录58——Keras GhostNet模型的复现详解

神经网络学习小记录60——Keras GhostNet模型的复现详解学习前言什么是GhostNet模型GhostNet模型的实现思路1、Ghost Module2、Ghost Bottlenecks3、Ghostnet的构建GhostNet的代码构建 学习前言 GhostNet是华为诺亚方舟实验室提出来的一个非常有趣的网络,我们一起来学习一下。 什么是GhostNet模型 2020年,华为新出了一个轻量级网络,命名为GhostNet。 在优秀CNN模型中,特征图存在冗余是非常重要的。如图所示,这个是对Re

Bubbliiiing的学习小课堂 7930

CocosCreator视频播放黑屏?手把手教你封装VideoPlayer组件解决Web环境问题

本文针对Cocos Creator在Web环境下视频播放黑屏等常见问题,提供了一套工程化的VideoPlayer组件封装解决方案。文章深入剖析了浏览器自动播放策略、DOM样式隔离等核心挑战,并手把手教你实现一个健壮的管理器,涵盖兼容性处理、性能优化与内存管理,确保视频播放稳定流畅。

plum99的博客 591

DeepSeek-OCR又更新:一起看下OCR1和OCR2

DeepSeek-AI 最近又又开源了,这次是DeepSeek-OCR2,结合之前发布的DeepSeek-OCR ,可以发现DeepSeek走出了一条不同于主流 OCR 方案的技术路线。第一代模型探索了**“视觉作为文本压缩介质”的可行性,打破了传统的序列长度限制;第二代模型则通过“Visual Causal Flow(视觉因果流)”**架构,将因果推理引入视觉编码器,解决了复杂排版下的阅读顺序难题。本文将从架构设计、逻辑结构、训练范式及工程实现四个维度,深度剖析这两代模型的异同与创新。

kakaZhui的博客 619

神经网络-GhostNet的网络结构、代码实现

2020年,华为提出了一个轻量级网络GhostNet在优秀CNN模型中,特征图存在冗余是非常重要的。如下图所示,是对ResNet-50第一个残差块特征图进行可视化的结果,当给一个神经网络输入一张图片时,我们可以获得特别多的特征图。利用小扳手连接起来的两幅特征图(Ghost对),它们的相似性就特别高,这就是神经网络中存在的特征图冗杂的情况。如果按照传统的思考方式,可能认为这些特征图存在冗余,是多余信息,会想办法避免产生这些高度相似的特征图但是作者思路清奇,认为CNN。

m0_55908255的博客 2730

ARC学习(6)arc 编译器overlap 地址重叠方式使用

摘要:本文介绍了ARC编译器中使用overlap地址重叠的方法。

张一西的博客 714

Ghostnet论文实践:Ghost-Resnet56 复现

Ghostnet论文实践:Ghost-Resnet56 复现 Ghostnet 是2020年CVPR的一篇轻量级网络并超越了MobilenetV3。本文旨在探究Ghostnet 中Ghost module的实际效果,主要复现了paper中Ghost-Resnet56,并使用其训练Cifar10。然而并没有达到与稳重所述一致的效果,仅在此做一些记录。 构建Ghost-Resnet网络 需求: 构建G...

Kerkoporta 5112

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1049

4、基于抽象解释的静态分析器中的跟踪分区与ASTRÉE分析器解析

本博客探讨了基于抽象解释的静态分析器中的跟踪分区技术,并深入解析了ASTRÉE分析器的工作原理和应用。通过示例程序说明了跟踪分区如何提升分析精度,减少误报,以及ASTRÉE如何利用多种数值抽象域(如八角形域、浮点区间线性形式等)来处理复杂的嵌入式C程序。此外,还讨论了ASTRÉE的模块化设计、循环展开优化、用户断言与自动细化的局限性等内容,为保障嵌入式软件的安全性和可靠性提供了理论与实践支持。

kotlin6android的博客 115

GhostNet实战:使用GhostNet实现图像分类任务(二)

训练的主要步骤:1、使用AverageMeter保存自定义变量,包括loss,ACC1,ACC5。2、将数据输入mixup_fn生成mixup数据,然后输入model计算loss。3、 optimizer.zero_grad() 梯度清零,把loss关于weight的导数变成0。4、如果使用混合精度,则with torch.cuda.amp.autocast(),开启混合精度。计算loss。scaler.scale(loss).backward(),梯度放大。

AI浩 1233

【突变检验合集】含Pettitt突变检验等

突变检验方法合集

WW、forever的博客 3523

GhostNet: More Features from Cheap Operations 【阅读记录】

code :https: //github.com/huawei-noah/ghostnet paper:https://arxiv.org/pdf/1911.11907.pdf 摘要: 如图1所示,卷积层的输出特征映射通常包含许多冗余,其中一些可能彼此相似。 我们指出,没有必要用大量的FLOP和参数逐个生成这些冗余特征映射。 分析: # 2020.06.09-Changed for building GhostNet # ...

乐亦亦乐的博客 355

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

GhostNet实战指南:从零开始构建图像分类系统

想要快速构建一个高效、轻量级的图像分类系统吗?GhostNet_100.in1k模型就是你的理想选择!这篇终极指南将带你从零开始,全面掌握这个轻量级神经网络模型的实战应用技巧。 ## 什么是GhostNet模型? GhostNet是一种创新的轻量级卷积神经网络架构,它通过"Ghost模块"技术实现了**高效特征提取**与**参数优化**的完美平衡。该模型在保持高精度的同时,大幅减少了计算量和参

gitblog_01041的博客 485

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

GhostNet-100.in1k最佳实践:生产环境部署与监控终极指南

在当今AI应用蓬勃发展的时代,轻量级高效的图像分类模型变得尤为重要。GhostNet-100.in1k作为一款在ImageNet-1k数据集上训练的轻量级图像分类模型,以其仅5.2M参数和0.1GMACs的计算量,在生产环境中展现出卓越的性能表现。本文将为您提供完整的生产环境部署与监控指南,帮助您充分发挥这一高效模型的潜力。 ## 🔥 为什么选择GhostNet-100.in1k? Ghos

gitblog_00122的博客 869

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

GhostNet轻量模型实现甲骨文单字符识别

甲骨文识别属于古文字图像识别的典型场景,其核心挑战在于极低分辨率、高度形变、单字符无上下文及嵌入式部署约束。其技术原理需兼顾特征冗余消除与局部判别性建模,GhostNet通过主特征+幽灵特征机制,在参数量与计算开销间取得关键平衡,显著提升边缘设备上的推理效率与热稳定性。该方案不仅支撑小样本条件下的高鲁棒性分类,更通过Grad-CAM等可解释性设计,满足数学建模竞赛对决策依据的硬性要求。本文聚焦于树莓派平台下从数据清洗、GhostNet定制化构建到对抗增强训练的全栈实践路径,为古籍数字化、边缘AI文保应用提供

weixin_30463341的博客 424

边缘AI贴纸:从GhostNet模型到低功耗嵌入式部署全解析

边缘AI(Edge AI)作为将人工智能计算从云端下沉至设备终端的关键技术,其核心原理在于通过本地化模型推理,实现低延迟、高隐私保护的数据处理。这项技术的核心价值在于解决了传统云AI方案在实时性、带宽成本和数据安全方面的痛点,尤其适用于物联网、嵌入式视觉等对功耗和响应速度有严苛要求的场景。在实际工程实践中,模型量化与硬件加速是两大关键技术,其中训练后量化和量化感知训练能有效压缩模型体积并提升推理效率,而NPU(神经网络处理器)的集成则提供了专用的计算加速。本文以一款集成了GhostNet模型的微型边缘AI贴

weixin_34245749的博客 422

(C1-1)MobileNet、ShuffleNet、GhostNet

轻量化网络模型

木槿qwer的博客 591

PFLD+GhostNet+MobileOne=PFLD_GhostOne,重参数化让PFLD重生,精度提升超过4%,速度提升超过55%,代码已开源

结合GhostNet和MobileOne对人脸关键点检测模型PFLD进行优化,有效提高模型的运行时间和定位精度。

u010892804的博客 4901
上一篇: 关于 model.load_state_dict 加载部分预训练参数
下一篇: anomalib实战学习记录:安装及训练官方数据
meng56421
博客等级 码龄5年 236粉丝 41原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值