轻量级网络论文-MobileNet v1 详解

简介: 轻量级网络论文-MobileNet v1 详解

文章同步发于 github博客园知乎。最新版以 github 为主。如果看完文章有所收获,一定要先点赞后收藏。毕竟,赠人玫瑰,手有余香

MobileNet 论文的主要贡献在于提出了一种深度可分离卷积架构(DW+PW 卷积),先通过理论证明这种架构比常规的卷积计算成本(Mult-Adds)更小,然后通过分类、检测等多种实验证明模型的有效性。

1、相关工作

标准卷积

一个大小为 h1×w1h_1\times w_1h1×w1 过滤器(2 维卷积核),沿着 feature map 的左上角移动到右下角,过滤器每移动一次,将过滤器参数矩阵和对应特征图 h1×w1×c1h_1 \times w_1 \times c_1h1×w1×c1 大小的区域内的像素点相乘后累加得到一个值,又因为 feature map 的数量(通道数)为 c1c_1c1,所以我们需要一个 shape(c1,h1,w1) (c_1, h_1, w_1)(c1,h1,w1) 的滤波器( 3 维卷积核),将每个输入 featue map 对应输出像素点位置计算和的值相加,即得到输出 feature map 对应像素点的值。又因为输出 feature map 的数量为 c2c_2c2 个,所以需要 c2c_2c2 个滤波器。标准卷积抽象过程如下图所示。

网络异常,图片无法展示
|


2D 卷积计算过程动态图如下,通过这张图能够更直观理解卷积核如何执行滑窗操作,又如何相加并输出 c2c_2c2 个  feature map ,动态图来源 这里

网络异常,图片无法展示
|


分组卷积

Group Convolution 分组卷积,最早见于 AlexNet。常规卷积与分组卷积的输入 feature map 与输出 feature map 的连接方式如下图所示,图片来自CondenseNet

网络异常,图片无法展示
|


分组卷积的定义:对输入 feature map 进行分组,然后分组分别进行卷积。假设输入 feature map 的尺寸为 H×W×c1H \times W \times c_{1}H×W×c1,输出 feature map 数量为 c2c_2c2 个,如果将输入 feature map 按通道分为 ggg 组,则每组特征图的尺寸为 H×W×c1gH \times W \times \frac{c_1}{g}H×W×gc1每组对应的滤波器(卷积核)的 尺寸 为 h1×w1×c1gh_{1} \times w_{1} \times \frac{c_{1}}{g}h1×w1×gc1,每组的滤波器数量为  c2g\frac{c_{2}}{g}gc2 个,滤波器总数依然为 c2c_2c2 个,即分组卷积的卷积核 shape(c2,c1g,h1,w1)(c_2,\frac{c_1}{g}, h_1,w_1)(c2,gc1,h1,w1)。每组的滤波器只与其同组的输入 map 进行卷积,每组输出特征图尺寸为 H×W×c2gH \times W \times \frac{c_{2}}{g}H×W×gc2,将 ggg 组卷积后的结果进行拼接 (concatenate) 得到最终的得到最终尺寸为 H×W×c2H \times W \times c_2H×W×c2 的输出特征图,其分组卷积过程如下图所示:

网络异常,图片无法展示
|


分组卷积的意义:分组卷积是现在网络结构设计的核心,它通过通道之间的稀疏连接(也就是只和同一个组内的特征连接)来降低计算复杂度。一方面,它允许我们使用更多的通道数来增加网络容量进而提升准确率,但另一方面随着通道数的增多也对带来更多的 MACMACMAC。针对 1×11 \times 11×1 的分组卷积,MACMACMACFLOPsFLOPsFLOPs 计算如下:

MACC=H×W×1×1×c1gc2g×g=hwc1c2gFLOPs=2×MACCParams=g×c2g×c1g×1×1+c2=c1c2gMAC=HW(c1+c2)+c1c2g\begin{aligned} & MACC = H \times W \times 1 \times 1 \times \frac{c_{1}}{g}\frac{c_{2}}{g} \times g = \frac{hwc_{1}c_{2}}{g} \\ & FLOPs = 2 \times MACC \\ & Params = g \times \frac{c_2}{g}\times\frac{c_1}{g} \times 1\times 1 + c_2 = \frac{c_{1}c_{2}}{g} \\ & MAC = HW(c_1 + c_2) + \frac{c_{1}c_{2}}{g} \\ \end{aligned}MACC=H×W×1×1×gc1gc2×g=ghwc1c2FLOPs=2×MACCParams=g×gc2×gc1×1×1+c2=gc1c2MAC=HW(c1+c2)+gc1c2

从以上公式可以得出分组卷积的参数量和计算量是标准卷积的 1g\frac{1}{g}g1 的结论 ,但其实对分组卷积过程进行深入理解之后也可以直接得出以上结论。

分组卷积的深入理解:对于 1×11\times 11×1 卷积,常规卷积输出的特征图上,每一个像素点是由输入特征图的 c1c_1c1 个点计算得到,而分组卷积输出的特征图上,每一个像素点是由输入特征图的 c1g \frac{c_1}{g}gc1个点得到(参考常规卷积计算过程)。卷积运算过程是线性的,自然,分组卷积的参数量和计算量是标准卷积的 1g\frac{1}{g}g1

当分组卷积的分组数量 = 输入 feature map 数量 = 输出 feature map 数量,即 g=c1=c2g=c_1=c_2g=c1=c2,有 c1c_1c1 个滤波器,且每个滤波器尺寸为 1×K×K1 \times K \times K1×K×K 时,Group Convolution 就成了 Depthwise Convolution(DW 卷积),DW 卷积的卷积核权重尺寸为(c1,1,K,K)(c_{1}, 1, K, K)(c1,1,K,K)

常规卷积的卷积核权重 shape 都为(C_out, C_in, kernel_height, kernel_width),分组卷积的卷积核权重 shape 为(C_out, C_in/g, kernel_height, kernel_width),DW 卷积的卷积核权重 shape 为(C_in, 1, kernel_height, kernel_width)。

从 Inception module 到 depthwise separable convolutions

深度可分离卷积(depthwise separable convolutions)的提出最早来源于 Xception 论文,Xception 的论文中提到,对于卷积来说,卷积核可以看做一个三维的滤波器:通道维+空间维(Feature Map 的宽和高),常规的卷积操作其实就是实现通道相关性和空间相关性的联合映射Inception 模块的背后存在这样的一种假设:卷积层通道间的相关性和空间相关性是可以退耦合(完全可分)的,将它们分开映射,能达到更好的效果(the fundamental hypothesis behind Inception is that cross-channel correlations and spatial correlations are sufficiently decoupled that it is preferable not to map them jointly.)。

引入深度可分离卷积的 Inception,称之为 Xception,其作为 Inception v3 的改进版,在 ImageNet 和 JFT 数据集上有一定的性能提升,但是参数量和速度并没有太大的变化,因为 Xception 的目的也不在于模型的压缩。深度可分离卷积的 Inception 模块如图  Figure 4 所示。

网络异常,图片无法展示
|


Figure 4 中的“极限” Inception 模块与本文的主角-深度可分离卷积模块相似,区别在于:深度可分离卷积先进行 channel-wise 的空间卷积,再进行 1×11 \times 11×1 的通道卷积,Figure 4 的 Inception 则相反;

2、MobileNets 结构

2.1,深度可分离卷积

MobileNets 是谷歌 2017 年提出的一种高效的移动端轻量化网络,其核心是深度可分离卷积(depthwise separable convolutions),深度可分离卷积的核心思想是将一个完整的卷积运算分解为两步进行,分别为 Depthwise Convolution(DW 卷积) 与 Pointwise Convolution(PW 卷积)。深度可分离卷积的计算步骤和滤波器尺寸如下所示。

网络异常,图片无法展示
|


网络异常,图片无法展示
|


Depthwise 卷积

注意本文 DW 和 PW 卷积计算量的计算与论文有所区别,本文的输出 Feature map 大小是 DG×DGD_G \times D_GDG×DG, 论文公式是DF×DFD_F \times D_FDF×DF

不同于常规卷积操作, Depthwise Convolution 的一个卷积核只负责一个通道,一个通道只能被一个卷积核卷积(不同的通道采用不同的卷积核卷积),也就是输入通道、输出通道和分组数相同的特殊分组卷积,因此 Depthwise(DW)卷积不会改变输入特征图的通道数目。深度可分离卷积的 DW卷积步骤如下图:

网络异常,图片无法展示
|


DW 卷积的计算量 MACC=M×DG2×DK2MACC = M \times D_{G}^{2} \times D_{K}^{2}MACC=M×DG2×DK2

Pointwise 卷积

上述 Depthwise 卷积的问题在于它让每个卷积核单独对一个通道进行计算,但是各个通道的信息没有达到交换,从而在网络后续信息流动中会损失通道之间的信息,因此论文中就加入了 Pointwise 卷积操作,来进一步融合通道之间的信息。PW 卷积是一种特殊的常规卷积,卷积核的尺寸为 1×11 \times 11×1PW 卷积的过程如下图:

网络异常,图片无法展示
|


假设输入特征图大小为 DG×DG×MD_{G} \times D_{G} \times MDG×DG×M,输出特征图大小为 DG×DG×ND_{G} \times D_{G} \times NDG×DG×N,则滤波器尺寸为 1×1×M1 \times 1 \times M1×1×M,且一共有 NNN 个滤波器。因此可计算得到 PW 卷积的计算量 MACC=N×M×DG2MACC = N \times M \times D_{G}^{2}MACC=N×M×DG2

综上:DepthwisePointwise 卷积这两部分的计算量相加为 MACC1=M×DG2×DK2+N×M×DG2MACC1 = M \times D_{G}^{2} \times D_{K}^{2} + N \times M \times D_{G}^{2}MACC1=M×DG2×DK2+N×M×DG2,而标准卷积的计算量 MACC2=N×DG2×DK2×MMACC2 = N \times D_{G}^{2} \times D_{K}^{2} \times MMACC2=N×DG2×DK2×M。所以深度可分离卷积计算量于标准卷积计算量比值的计算公式如下。

Depthwise Separable ConvStandard Conv=M×DG2(DK2+N)N×DG2×DK2×M=DK2+NDK2×N=1N+1DK2\begin{aligned} \frac{Depthwise \ Separable \ Conv}{Standard \ Conv} &= \frac{M \times D_{G}^{2}(D_{K}^{2} + N)}{N \times D_{G}^{2} \times D_{K}^{2} \times M} \\ &= \frac{D_{K}^{2} + N}{D_{K}^{2} \times N} \\ &= \frac{1}{N} + \frac{1}{D_{K}^{2}} \\ \end{aligned}StandardConvDepthwiseSeparableConv=N×DG2×DK2×MM×DG2(DK2+N)=DK2×NDK2+N=N1+DK21

可以看到 Depthwise + Pointwise 卷积的计算量相较于标准卷积近乎减少了 NNN 倍,NNN 为输出特征图的通道数目,同理参数量也会减少很多。在达到相同目的(即对相邻元素以及通道之间信息进行计算)下, 深度可分离卷积能极大减少卷积计算量,因此大量移动端网络的 backbone 都采用了这种卷积结构,再加上模型蒸馏,剪枝,能让移动端更高效的推理。

深度可分离卷积的详细计算过程可参考 Depthwise卷积与Pointwise卷积

2.2、网络结构

3×33 \times 33×3 的深度可分离卷积 Block 结构如下图所示:

网络异常,图片无法展示
|


左边是带 bnrelu 的标准卷积层,右边是带 bn 和 relu 的深度可分离卷积层。3×33 \times 33×3 的深度可分离卷积 Block 网络的 pytorch 代码如下:

class MobilnetV1Block(nn.Module):
    """Depthwise conv + Pointwise conv"""
    def __init__(self, in_channels, out_channels, stride=1):
        super(MobilnetV1Block, self).__init__()
        # dw conv kernel shape is (in_channels, 1, ksize, ksize)
        self.dw = nn.Conv2d(in_channels, in_channels, kernel_size=3,stride=stride,padding=1, groups=in_channels, bias=False)
        self.bn1 = nn.BatchNorm2d(in_channels)
        self.pw = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channels)
    def forward(self, x):
        out1 = F.relu(self.bn1(self.dw(x)))
        out2 = F.relu(self.bn2(self.pw(out1)))
        return out2
复制代码

MobileNet v1pytorch 模型导出为 onnx 模型后,深度可分离卷积 block 结构图如下图所示。

网络异常,图片无法展示
|


仅用 MobileNets 的 Mult-Adds(乘加操作)次数更少来定义高性能网络是不够的,确保这些操作能够有效实施也很重要。例如非结构化稀疏矩阵运算(unstructured sparse matrix operations)通常并不会比密集矩阵运算(dense matrix operations)快,除非是非常高的稀疏度。

这句话是不是和 shufflenet v2 的观点一致,即不能仅仅以 FLOPs 计算量来表现网络的运行速度,除非是同一种网络架构。

MobileNet 模型结构将几乎所有计算都放入密集的 1×1 卷积中(dense 1 × 1 convolutions),卷积计算可以通过高度优化的通用矩阵乘法(GEMM)函数来实现。 卷积通常由 GEMM 实现,但需要在内存中进行名为 im2col 的初始重新排序,然后才映射到 GEMM。 caffe 框架就是使用这种方法实现卷积计算。 1×1 卷积不需要在内存中进行重新排序,可以直接使用 GEMM(最优化的数值线性代数算法之一)来实现。

如表 2 所示,MobileNet 模型的 1x1 卷积占据了 95% 的计算量和 75% 的参数,剩下的参数几乎都在全连接层中, 3x3 的 DW 卷积核常规卷积占据了很少的计算量(Mult-Adds)和参数。

网络异常,图片无法展示
|


2.3、宽度乘系数-更小的模型

尽管基本的 MobileNet 体系结构已经很小且网络延迟 latency 很低,但很多情况下特定用例或应用可能要求模型变得更小,更快。为了构建这些更小且计算成本更低的模型,我们引入了一个非常简单的参数 α\alphaα,称为 width 乘数宽度乘数α\alphaα 的作用是使每一层的网络均匀变薄。对于给定的层和宽度乘数 α\alphaα,输入通道的数量变为 αM\alpha MαM,而输出通道的数量 NNN 变为 αN\alpha NαN。具有宽度乘数 α\alphaα 的深度可分离卷积(其它参数和上文一致)的计算成本为:

αM×DG2×DK2+αN×αM×DG2\alpha M \times D_{G}^{2} \times D_{K}^{2} + \alpha N \times \alpha M \times D_{G}^{2}αM×DG2×DK2+αN×αM×DG2

其中 α∈(0,1]\alpha \in (0,1]α(0,1],典型值设置为 1、0.75、0.50.25α=1\alpha = 1α=1 是基准 MobileNet 模型,α<1\alpha < 1α<1 是缩小版的 MobileNets宽度乘数的作用是将计算量和参数数量大约减少 α2\alpha^2α2 倍,从而降低了网络计算成本( computational cost of a neural network)。 宽度乘数可以应用于任何模型结构,以定义新的较小模型,且具有合理的准确性、网络延迟 latency 和模型大小之间的权衡。 它用于定义新的精简结构,需要从头开始进行训练模型。基准 MobileNet 模型的整体结构定义如表 1 所示。

网络异常,图片无法展示
|


2.4、分辨率乘系数-减少表示

减少模型计算成本的的第二个超参数(hyper-parameter)是分辨率因子ρ\rhoρ,论文将其应用于输入图像,则网络的每一层 feature map 大小也要乘以 ρ\rhoρ。实际上,论文通过设置输入分辨率来隐式设置 ρ\rhoρ。 将网络核心层的计算成本表示为具有宽度乘数 α\alphaα 和分辨率乘数 ρ\rhoρ 的深度可分离卷积的公式如下:αM×ρDG2×DK2+αN×αM×ρDG2\alpha M \times \rho D_{G}^{2} \times D_{K}^{2} + \alpha N \times \alpha M \times \rho D_{G}^{2}αM×ρDG2×DK2+αN×αM×ρDG2其中 ρ∈(0,1]\rho \in (0,1]ρ(0,1],通常是隐式设置的,因此网络的输入分辨率为 224、192、160128ρ=1\rho = 1ρ=1 时是基准(baseline) MobilNet,ρ<1\rho < 1ρ<1 时缩小版 MobileNets分辨率乘数的作用是将计算量减少 ρ2\rho^2ρ2

2.5、模型结构总结

  • 整个网络不算平均池化层与 softmax 层,且将 DW 卷积和 PW 卷积计为单独的一层,则 MobileNet28 层网络。+ 在整个网络结构中步长为2的卷积较有特点,卷积的同时充当下采样的功能;
  • 第一层之后的 26 层都为深度可分离卷积的重复卷积操作,分为 4 个卷积 stage
  • 每一个卷积层(含常规卷积、深度卷积、逐点卷积)之后都紧跟着批规范化和 ReLU 激活函数;
  • 最后一层全连接层不使用激活函数。

3、实验

作者分别进行了 Stanford Dogs dataset 数据集上的细粒度识别、大规模地理分类、人脸属性分类、COCO 数据集上目标检测的实验,来证明与 Inception V3GoogleNetVGG16backbone 相比,MobilNets 模型可以在计算量(Mult-Adds)数 10 被下降的情况下,但是精度却几乎不变。

4、结论

论文提出了一种基于深度可分离卷积的新模型架构,称为 MobileNets。 在相关工作章节中,作者首先调查了一些让模型更有效的重要设计原则,然后,演示了如何通过宽度乘数和分辨率乘数来构建更小,更快的 MobileNet,通过权衡合理的精度以减少模型大小和延迟。 然后,我们将不同的 MobileNets 与流行的模型进行了比较,这些模型展示了出色的尺寸,速度和准确性特性。 最后,论文演示了 MobileNet 在应用于各种任务时的有效性。

5、基准模型代码

自己复现的基准 MobileNet v1 代模型 pytorch 代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision.models as models
from torch import flatten
class MobilnetV1Block(nn.Module):
    """Depthwise conv + Pointwise conv"""
    def __init__(self, in_channels, out_channels, stride=1):
        super(MobilnetV1Block, self).__init__()
        # dw conv kernel shape is (in_channels, 1, ksize, ksize)
        self.dw = nn.Sequential(
            nn.Conv2d(in_channels, 64, kernel_size=3,
                      stride=stride, padding=1, groups=4, bias=False),
            nn.BatchNorm2d(in_channels),
            nn.ReLU(inplace=True)
        )
        # print(self.dw[0].weight.shape)  # print dw conv kernel shape
        self.pw = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=1,
                      stride=1, padding=0, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        )
    def forward(self, x):
        x = self.dw(x)
        x = self.pw(x)
        return x
def convbn_relu(in_channels, out_channels, stride=2):
    return nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride,
                                   padding=1, bias=False),
                         nn.BatchNorm2d(out_channels),
                         nn.ReLU(inplace=True))
class MobileNetV1(nn.Module):
    # (32, 64, 1) means MobilnetV1Block in_channnels is 32, out_channels is 64, no change in map size.
    stage_cfg = [(32, 64, 1), 
           (64, 128, 2), (128, 128, 1),     # stage1 conv
           (128, 256, 2), (256, 256, 1),    # stage2 conv
           (256, 512, 2), (512, 512, 1), (512, 512, 1), (512, 512, 1), (512, 512, 1), (512, 512, 1), # stage3 conv
           (512, 1024, 2), (1024, 1024, 1)  # stage4 conv
    ]
    def __init__(self, num_classes=1000):
        super(MobileNetV1, self).__init__()
        self.first_conv = convbn_relu(3, 32, 2)  # Input image size reduced by half
        self.stage_layers = self._make_layers(in_channels=32)
        self.linear = nn.Linear(1024, num_classes)  # 全连接层
    def _make_layers(self, in_channels):
        layers = []
        for x in self.stage_cfg:
            in_channels = x[0]
            out_channels = x[1]
            stride = x[2]
            layers.append(MobilnetV1Block(in_channels, out_channels, stride))
            in_channels = out_channels
        return nn.Sequential(*layers)
    def forward(self, x):
        """Feature map shape(h、w) is 224 -> 112 -> 56 -> 28 -> 14 -> 7 -> 1"""
        x = self.first_conv(x)
        x = self.stage_layers(x)
        x = F.avg_pool2d(x, 7)  # x shape is 7*7
        x = flatten(x, 1)       # x = x.view(x.size(0), -1)
        x = self.linear(x)
        return x
if __name__ == "__main__":
    model = MobileNetV1()
    model.eval()                  # set the model to inference mode
    input_data = torch.rand(1, 3, 224, 224)
    outputs = model(input_data)
    print("Model output size is", outputs.size())
复制代码


程序运行结果如下:

Model output size is torch.Size([1, 1000])

个人思考

在降低 FLOPs 计算量上,MobileNet 的网络架构设计确实很好,但是 MobileNet 模型在 GPUDSPTPU 硬件上却不一定性能好,原因是不同硬件进行运算时的行为不同,从而导致了 FLOPs少不等于 latency的问题。

如果要实际解释 TPUDSP 的运作原理,可能有点麻烦,可以参考下图,从结果直观地理解他们行为上的差异。考虑一个简单的 convolution,在 CPUlatency 随着 inputoutputchannel 上升正相关的增加。然而在 DSP 上却是阶梯型,甚至在更高的 channel 数下存在特别低latency 的甜蜜点。

网络异常,图片无法展示
|


在一定的程度上,网络越深越宽,性能越好。宽度,即通道(channel)的数量,网络深度,即 layer 的层数,如 resnet1818 个卷积层。注意我们这里说的和宽度学习一类的模型没有关系,而是特指深度卷积神经网络的(通道)宽度。

  • 网络深度的意义CNN 的网络层能够对输入图像数据进行逐层抽象,比如第一层学习到了图像边缘特征,第二层学习到了简单形状特征,第三层学习到了目标形状的特征,网络深度增加也提高了模型的抽象能力。
  • 网络宽度的意义:网络的宽度(通道数)代表了滤波器(3 维)的数量,滤波器越多,对目标特征的提取能力越强,即让每一层网络学习到更加丰富的特征,比如不同方向、不同频率的纹理特征等。

后续改进-MobileDets

  1. FLOPs 低不等于 latency 低,尤其是在有加速功能的硬体 (GPUDSPTPU )上不成立。
  2. MobileNet conv block (depthwise separable convolution)在有加速功能的硬件(专用硬件设计-NPU 芯片)上比较没有效率。
  3. channel 数的情况下 (如网路的前几层),在有加速功能的硬件使用普通convolution 通常会比separable convolution 有效率。
  4. 在大多数的硬件上,channel 数为 8 的倍数比较有利计算。
  5. DSPTPU 上,一般我们需要运算为 uint8 形式,quantization低精度量化)是常见的技巧。
  6. DSPTPU 上,h-Swishsqueeze-and-excitation 效果不明显 (因为硬体设计与 uint8 压缩的关系)。
  7. DSPTPU 上,5x5convolution 比较没效率。

参考资料

  1. Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution
  2. 理解分组卷积和深度可分离卷积如何降低参数量
  3. 深度可分离卷积(Xception 与 MobileNet 的点滴)
  4. MobileNetV1代码实现
  5. Depthwise卷积与Pointwise卷积
  6. 【CNN结构设计】深入理解深度可分离卷积
  7. FLOPs与模型推理速度
  8. MobileDets: FLOPs不等于Latency,考量不同硬体的高效架构


相关文章
|
2月前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
68 3
|
1月前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
2月前
|
机器学习/深度学习 Web App开发 人工智能
轻量级网络论文精度笔(一):《Micro-YOLO: Exploring Efficient Methods to Compress CNN based Object Detection Model》
《Micro-YOLO: Exploring Efficient Methods to Compress CNN based Object Detection Model》这篇论文提出了一种基于YOLOv3-Tiny的轻量级目标检测模型Micro-YOLO,通过渐进式通道剪枝和轻量级卷积层,显著减少了参数数量和计算成本,同时保持了较高的检测性能。
41 2
轻量级网络论文精度笔(一):《Micro-YOLO: Exploring Efficient Methods to Compress CNN based Object Detection Model》
|
2月前
|
机器学习/深度学习 编解码 算法
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
MobileNetV3是谷歌为移动设备优化的神经网络模型,通过神经架构搜索和新设计计算块提升效率和精度。它引入了h-swish激活函数和高效的分割解码器LR-ASPP,实现了移动端分类、检测和分割的最新SOTA成果。大模型在ImageNet分类上比MobileNetV2更准确,延迟降低20%;小模型准确度提升,延迟相当。
72 1
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
|
2月前
|
编解码 人工智能 文件存储
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
YOLOv7是一种新的实时目标检测器,通过引入可训练的免费技术包和优化的网络架构,显著提高了检测精度,同时减少了参数和计算量。该研究还提出了新的模型重参数化和标签分配策略,有效提升了模型性能。实验结果显示,YOLOv7在速度和准确性上超越了其他目标检测器。
54 0
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
|
1天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
34 17
|
12天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
13天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
36 10
|
14天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
43 10
|
15天前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。