CNN网络设计

article/2025/9/16 8:49:54

系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、CNN基本概念
  • 二、卷积计算类型
  • 其他算子
  • 常用激活函数
  • 经典轻量化模型


前言

一图胜千言
在这里插入图片描述

一、CNN基本概念

感受野指的是卷积神经网络每一层输出的特征图(feature map)上每个像素点映射回输入图像上的区域大小,神经元感受野的范围越大表示其能接触到的原始图像范围就越大,也意味着它能学习更为全局,语义层次更高的特征信息,相反,范围越小则表示其所包含的特征越趋向局部和细节。因此感受野的范围可以用来大致判断每一层的抽象层次,并且我们可以很明显地知道网络越深,神经元的感受野越大。
在这里插入图片描述
分辨率指的是输入模型的图像尺寸,即长宽大小。通常情况会根据模型下采样次数n和最后一次下采样后feature map的分辨率k×k来决定输入分辨率的大小,即:r = k * 2 ** n

从输入r×r到最后一个卷积特征feature map的k×k,整个过程是一个信息逐渐抽象化的过程,即网络学习到的信息逐渐由低级的几何信息转变为高级的语义信息,这个feature map的大小可以是3×3,5×5,7×7,9×9等等,k太大会增加后续的计算量且信息抽象层次不够高,影响网络性能,k太小会造成非常严重的信息丢失,如原始分辨率映射到最后一层的feature map有效区域可能不到一个像素点,使得训练无法收敛。

在ImageNet分类任务中,通常设置的5次下采样,并且考虑到其原始图像大多数在300分辨率左右,所以把最后一个卷积特征大小设定为7×7,将输入尺寸固定为224×224×3。在目标检测任务中,很多采用的是416×416×3的输入尺寸,当然由于很多目标检测模型是全卷积的结构,通常可以使用多尺寸训练的方式,即每次输入只需要保证是32×的图像尺寸大小就行,不固定具体数值。但这种多尺度训练的方式在图像分类当中是不通用的,因为分类模型最后一层是全连接结构,即矩阵乘法,需要固定输入数据的维度。

神经网络的深度决定了网络的表达能力,它有两种计算方法,早期的backbone设计都是直接使用卷积层堆叠的方式,它的深度即神经网络的层数,后来的backbone设计采用了更高效的module(或block)堆叠的方式,每个module是由多个卷积层组成,它的深度也可以指module的个数,这种说法在神经架构搜索(NAS)中出现的更为频繁。通常而言网络越深表达能力越强,但深度大于某个值可能会带来相反的效果,所以它的具体设定需要不断调参得到。

宽度决定了网络在某一层学到的信息量,但网络的宽度时指的是卷积神经网络中最大的通道数,由卷积核数量最多的层决定。通常的结构设计中卷积核的数量随着层数越来越多的,直到最后一层feature map达到最大,这是因为越到深层,feature map的分辨率越小,所包含的信息越高级,所以需要更多的卷积核来进行学习。通道越多效果越好,但带来的计算量也会大大增加,所以具体设定也是一个调参的过程,并且各层通道数会按照8×的倍数来确定,这样有利于GPU的并行计算。
在这里插入图片描述
下采样层有两个作用,一是减少计算量,防止过拟合,二是增大感受野,使得后面的卷积核能够学到更加全局的信息。下采样的设计有两种:

1.采用stride为2的池化层,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因为它计算简单且最大响应能更好保留纹理特征;

2.采用stride为2的卷积层,下采样的过程是一个信息损失的过程,而池化层是不可学习的,用stride为2的可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一定的计算量。

上采样(Up-Sampling)
在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样,它的实现一般有三种方式:

1.插值,一般使用的是双线性插值,因为效果最好,虽然计算上比其他插值方式复杂,但是相对于卷积计算可以说不值一提;
2.转置卷积又或是说反卷积,通过对输入feature map间隔填充0,再进行标准的卷积计算,可以使得输出feature map的尺寸比输入更大;
3.Max Unpooling,在对称的max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余位置补0;
在这里插入图片描述

参数量指的网络中可学习变量的数量,包括卷积核的权重weight,批归一化(BN)的缩放系数γ,偏移系数β,有些没有BN的层可能有偏置bias,这些都是可学习的参数 ,即在模型训练开始前被赋予初值,在训练过程根据链式法则中不断迭代更新,整个模型的参数量主要由卷积核的权重weight的数量决定,参数量越大,则该结构对运行平台的内存要求越高,参数量的大小是轻量化网络设计的一个重要评价指标。

计算量(FLOPs)
神经网络的前向推理过程基本上都是乘累加计算,所以它的计算量也是指的前向推理过程中乘加运算的次数,通常用FLOPs来表示,即floating point operations(浮点运算数)。计算量越大,在同一平台上模型运行延时越长,尤其是在移动端/嵌入式这种资源受限的平台上想要达到实时性的要求就必须要求模型的计算量尽可能地低,但这个不是严格成正比关系,也跟具体算子的计算密集程度(即计算时间与IO时间占比)和该算子底层优化的程度有关。

二、卷积计算类型

标准卷积 (Convolution)
在神经网络架构设计中,标准卷积是最常见的结构,假设其输入feature map的维度是(1, iC, iH, iW),每个卷积核的维度是(1, iC, k, k),一次卷积滤波得到一层feature map的维度为(1,1, oH, oW),一共有oC个卷积核,则输出feature map的维度是(1, oC, oH, oW),计算量为iC×k×k×oC×oH×oW,计算过程如下图所示,由于太过基础,故不赘述。
在这里插入图片描述

深度卷积 (Depthwise Convolution)

深度卷积与标准卷积相比,顾名思义是在深度上做了文章,而这里的深度跟网络的深度无关,它指的通道,标准卷积中每个卷积核都需要与feature map的所有层进行计算,所以每个卷积核的通道数等于输入feature map的通道数,通过设定卷积核的数量可以控制输出feature map的通道数。而深度卷积每个卷积核都是单通道的,维度为(1,1,k,k) ,卷积核的个数为iC,即第i个卷积核与feature map第i个通道进行二维的卷积计算,最后输出维度为(1,iC,oH,oW),它不能改变输出feature map的通道数,所以通常会在深度卷积后面接上一个(oC,iC,1,1)的标准卷积来代替3×3或更大尺寸的标准卷积,总的计算量为k×k×iC×oH×oW+iC×1×1×oH×oW×oC,是普通卷积的1/oC+1/(k×k),大大减少了计算量和参数量,又可以达到相同的效果,这种结构被称为深度可分离卷积(Depthwise Separable Convolution),在MobileNet V1被提出,后来渐渐成为轻量化结构设计的标配。
在这里插入图片描述

深度卷积之前一直被吐槽在GPU上运行速度还不如一般的标准卷积,因为depthwise 的卷积核复用率比普通卷积要小很多,计算和内存访问的比值比普通卷积更小,因此会花更多时间在内存开销上,而且per-channel的矩阵计算很小不容易并行导致的更慢,但理论上计算量和参数量都是大大减少的,只是底层优化的问题。

分组卷积 (Group Convolution)

分组卷积最早在AlexNet中出现,当时作者在训练模型时为了减少显存占用而将feature map分组然后给多个GPU进行处理,最后把多个输出进行融合。具体计算过程是,分组卷积首先将输入feature map分成g个组,每个组的大小为(1, iC/g, iH, iW),对应每组中一个卷积核的大小是(1,iC/g,k,k),每组有oC/g个卷积核,所以每组输出feature map的尺寸为(1,oC/g,oH,oW),最终g组输出拼接得到一个(1,oC,oH,oW)的大feature map,总的计算量为iC/g×k×k×oC×oH×oW,是标准卷积的1/g,参数量也是标准卷积的1/g。
在这里插入图片描述
但由于feature map组与组之间相互独立,存在信息的阻隔,所以ShuffleNet提出对输出的feature map做一次channel shuffle的操作,即通道混洗,打乱原先的顺序,使得各个组之间的信息能够交互起来。

空洞卷积 (Dilated Convolution)

空洞卷积是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。通过间隔取值扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有更大的感受野。这里面有个扩张率(dilation rate)的系数,这个系数定义了这个间隔的大小,标准卷积相当于dilation rate为1的空洞卷积,下图展示的是dilation rate为2的空洞卷积计算过程,可以看出3×3的卷积核可以感知标准的5×5卷积核的范围,还有一种理解思路就是先对3×3的卷积核间隔补0,使它变成5×5的卷积,然后再执行标准卷积的操作。
在这里插入图片描述

转置卷积 (Transposed Convolutions)

转置卷积又称反卷积(Deconvolution),它和空洞卷积的思路正好相反,是为上采样而生,也应用于语义分割当中,而且他的计算也和空洞卷积正好相反,先对输入的feature map间隔补0,卷积核不变,然后使用标准的卷积进行计算,得到更大尺寸的feature map。
在这里插入图片描述
可变形卷积 (deformable convolution)
以上的卷积计算都是固定的,每次输入不同的图像数据,卷积计算的位置都是完全固定不变,即使是空洞卷积/转置卷积,0填充的位置也都是事先确定的。而可变性卷积是指卷积核上对每一个元素额外增加了一个h和w方向上偏移的参数,然后根据这个偏移在feature map上动态取点来进行卷积计算,这样卷积核就能在训练过程中扩展到很大的范围。而显而易见的是可变性卷积虽然比其他卷积方式更加灵活,可以根据每张输入图片感知不同位置的信息,类似于注意力,从而达到更好的效果,但是它比可行变卷积在增加了很多计算量和实现难度,目前感觉只在GPU上优化的很好,在其他平台上还没有见到部署。
在这里插入图片描述

其他算子

池化(pooling)
池化这个操作比较简单,一般在上采样和下采样的时候用到,没有参数,不可学习,但操作极为简单,和depthwise卷积类似,只是把乘累加操作替换成取最大/取平均操作。
最大池化和平均池化
在这里插入图片描述
全局平均池化
全局平均池化的操作是对一个维度为(C,H,W)的feature map,在HW方向整个取平均,然后输出一个长度为C的向量,这个操作一般在分类模型的最后一个feature map之后出现,然后接一个全连接层就可以完成分类结果的输出了。早期的分类模型都是把最后一个feature map直接拉平成C×H×W的向量,然后再接全连接层,但是显然可以看出来这个计算量极大,甚至有的模型最后一个全连接层占了整个模型计算量的50%以上,之后由研究人员发现对这个feature map做一个全局平均池化,然后再加全连接层可以达到相似的效果,且计算量降低到了原来的1/HW。
最大向上池化
这个操作在前面基本概念一节上采样段落中有描述,故不赘述。
全连接计算(Full Connected)
这个本质其实就是矩阵乘法,输入一个(B, iC)的数据,权重为(iC, oC),那么输出为(B, oC),在多层感知机和分类模型最后一层常常见到。
在这里插入图片描述

Addition / Concatenate分支
Addition和Concatenate分支操作统称为shortcut,如下图所示,操作极为简单。Addition是在ResNet中提出,两个相同维度的feature map相同位置点的值直接相加,得到新的相同维度feature map,这个操作可以融合之前的特征,增加信息的表达,Concatenate操作是在Inception中首次使用,被DenseNet发扬光大,和addition不同的是,它只要求两个feature map的HW相同,通道数可以不同,然后两个feature map在通道上直接拼接,得到一个更大的feature map,它保留了一些原始的特征,增加了特征的数量,使得有效的信息流继续向后传递。
在这里插入图片描述
Channel shuffle
channel shuffle是ShuffleNet中首次提出,主要是针对分组卷积中不同组之间信息不流通,对不同组的feature map进行混洗的一个操作,如下图所示,假设原始的feature map维度为(1,9,H,W),被分成了3个组,每个组有三个通道,那么首先将这个feature map进行reshape操作,得到(1,3,3,H,W),然后对中间的两个大小为3的维度进行转置,依然是(1,3,3,H,W),最后将通道拉平,变回(1,9,H,W),就完成了通道混洗,使得不同组的feature map间隔保存,增强了信息的交互。
在这里插入图片描述

常用激活函数

激活函数的非线性是神经网络发挥作用最重要的因素之一,而对于实际部署,激活函数的实现也是很重要的一个方面,实现的不好对加速效果影响很大,这里主要讲几个部署当中常见的激活函数。

ReLU系列
这里主要指常用的ReLU,ReLU6和leaky ReLU。ReLU比较好部署,小于0的部分为0,大于0的部分为原始值,只需要判断一下符号位就行;ReLU6与ReLU相比也只是在正向部分多了个阈值,大于6的值等于6,在实现时多了个比较也不算麻烦;而leaky ReLU和ReLU正向部分一样,都是大于0等于原始值,但负向部分却是等于原始值的1/10,浮点运算的话乘个0.1就好了,如果因为量化要实现整数运算,这块可以做个近似,如0.1用13>>7来代替,具体实现方法多种多样 ,还算简单。
在这里插入图片描述

Sigmoid系列
​ 这里主要指sigmoid,还有和他相关的swish:
在这里插入图片描述
可以看出,如果按照公式来实现sigmoid对低性能的硬件来说非常不友好,因为涉及到大量的exp指数运算和除法运算,于是有研究人员针对此专门设计了近似的硬件友好的函数h-sigmoid和h-swish函数,这里的h指的就是hardware的意思:
在这里插入图片描述

经典轻量化模型

MobileNet系列
ShuffleNet系列
GhostNet
Efficientnet-lite系列

针对不同的硬件平台(CPU、GPU、NPU)选择不同的模型结构。本人也在自己的项目中对比了使用yolofastest和 yolov4-tiny在CPU和rk1808上的运行效率。
在这里插入图片描述

这里作者对模型结构、模型计算量、访存量和硬件的算力、带宽能力(内存DDR)对运行速率的分析:怎样才能让你的模型更加高效运行?


http://chatgpt.dhexx.cn/article/6EneGoha.shtml

相关文章

CNN基本结构和经典网络

卷积网络的基本结构 数据输入层/ Input layer 3种常见的图像数据处理方式:一般CNN只用去均值 卷积计算层/ CONV layer 基本概念: depth:与神经元(filter)个数相等stribezero-padding 卷积宽长深度计算: 激励层(R…

CNN概述

CNN 卷积神经网络简介 特点 将大数据量的图片降维成小数据量有效保留图片特征 应用领域 人脸识别、自动驾驶、无人安防 CNN解决的问题 图像的数据量太大,导致成本很高,效率很低图像在数字化的过程中容易丢失特征(其实就对应了两个特点&…

常见CNN网络结构的详解和代码实现

1. AlexNet 论文地址:ImageNet Classification with Deep Convolutional Neural Networks 2012年提出的AlexNet的网络结构为: 结构说明如下: 1.1 ReLu(Rectified Linear Units)激活函数: Relu函数为 r e l u ( x ) m a x { 0 , x } { …

图像分类网络-经典CNN网络简介

在CNN网络结构的演化上,出现过许多优秀的CNN网络,CNN的经典结构始于1998年的LeNet,成于2012年历史性的AlexNet,从此大盛于图像相关领域,主要包括: 发展历史:Lenet --> Alexnet --> ZFnet …

使用PyTorch搭建CNN神经网络

使用pytorch搭建CNN神经网络 卷积运算的基本原理单层卷积运算valid convolutionsame convolution CNN的基本结构数据输入层卷积层池化层全连接层 数据导入的实现构建基础的CNN网络网络的设计损失函数和优化器训练函数和测试函数实现CNN网络的训练和测试 Googlenet的实现网络框架…

CNN(卷积神经网络)概述

过去几年,深度学习(Deep learning)在解决诸如视觉识别(visual recognition)、语音识别(speech recognition)和自然语言处理(natural language processing)等很多问题方面都表现出非常好的性能。在不同类型的深度神经网络当中,卷积…

CNN卷积网络

CNN卷积神经网络 1.与全连接神经网络的区别 1).总有至少一个卷积层 2).卷积层级之间的神经元是局部连接和权值共享(整张图片在使用同一个卷积核内的参数,卷积核里的值叫做权重,不会因为图像内位置的不同而改变卷积核内的权系数)&#xff0…

CNN(卷积神经网络)

一、卷积神经网络 1、CNN的基本知识 1、卷积神经网络(Convolutional Neural Networks,CNN)的作用:1.cnn跟全连接的区别:原来一个输出神经元的计算是跟所有输入层的神经元相连,现在只是局部输入层的神经元相连;同一所…

CNN卷积神经网络

目录 一、BP神经网络回顾 二、CNN卷积神经网络 1、CNN的主要概述 2、CNN的一般结构 三、CNN卷积神经网络的应用 四、常见的CNN卷积神经网络 一、BP神经网络回顾 人工全连接神经网络 (1)每相邻两层之间的每个神经元之间都是有边相连的 &#xff0…

深度学习----CNN几种常见网络结构及区别

一、 CNN结构演化历史的图二、 AlexNet网络 2.1 ReLU 非线性激活函数 多GPU训练(Training on Multiple GPUs)局部响应归一化(Local Response Normalization)重叠池化(Overlapping Pooling) 2.2 降低过拟合( Reducing Overfitting) 数据增强(Data Augmentation)Dropout 三、VG…

神经网络--从0开始搭建全连接网络和CNN网络

前言: Hello大家好,我是Dream。 今天来学习一下如何从0开始搭建全连接网络和CNN网络,并通过实验简单对比一下两种神经网络的不同之处,本文目录较长,可以根据需要自动选取要看的内容~ 本文目录: 一、搭建4层…

经典CNN网络:Resnet18网络结构输入和输出

前言 Q1:每当看到一个新的网络,总会思考,这个网络提出来有什么意义,解决了什么问题? Resnet18中的resnet就时网络结构呗,18应该是权重层的数量(参照VGG16的命名方法,应该时这样理解)。 Q2:为什么会出现Resn…

深度学习——CNN卷积神经网络

基本概念 概述 卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习中常用于处理具有网格结构数据的神经网络模型。它在计算机视觉领域广泛应用于图像分类、目标检测、图像生成等任务。 核心思想 CNN 的核心思想是通过利用局部…

通俗易懂:图解10大CNN网络架构

作者 | Raimi Karim 译者 | Major 编辑 | 赵雪 出品 | AI科技大本营(ID: rgznai100) 导语:近年来,许多卷积神经网络( CNN )跃入眼帘,而随着其越来越深的深度,我们难以对某个 CNN 的结…

详解CNN卷积神经网络

详解卷积神经网络(CNN) 详解卷积神经网络CNN概揽Layers used to build ConvNets 卷积层Convolutional layer池化层Pooling Layer全连接层Fully-connected layer 卷积神经网络架构 Layer PatternsLayer Sizing PatternsCase Studies 参考 卷积神经网络(Convolutional…

CNN 卷积神经网络

文章目录 9、CNN 卷积神经网络9.1 Revision9.2 Introduction9.3 Convolution9.3.1 Channel9.3.2 Layer9.3.3 Padding9.3.4 Stride 9.4 Max Pooling9.5 A Simple CNN9.5.1 GPU9.5.2 Code 19.5.3 Exercise9.5.4 Code 2 9.6 GoogLeNet9.6.1 Inception Module9.6.2 1 x 1 convoluti…

简要笔记-CNN网络

以下是CNN网络的简要介绍。 1 CNN的发展简述 CNN可以有效降低传统神经网络(全连接)的复杂性,常见的网络结构有LeNet、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等。 1.1 CNN常见的网络结构 (1)LeNet(1998年 ): 首个…

CNN神经网络

一、基础概念 1.1 卷积(filter) 、CNN使用卷积的思想和意义 改变全连接为局部连接,这是由于图片的特殊性造成的(图像的一部分的统计特性与其他部分是一样的),通过局部连接和参数共享,大范围的减少参数值。可以通过使用多个filter来提取图像的不同特征(…

卷积神经网络(CNN)详细介绍及其原理详解

文章目录 前言一、什么是卷积神经网络二、输入层三、卷积层四、池化层五、全连接层六、输出层七、回顾整个过程总结 前言 本文总结了关于卷积神经网络(CNN)的一些基础的概念,并且对于其中的细节进行了详细的原理讲解,通过此文可以…

CNN卷积神经网络详解

1、cnn卷积神经网络的概念 卷积神经网络(CNN),这是深度学习算法应用最成功的领域之一,卷积神经网络包括一维卷积神经网络,二维卷积神经网络以及三维卷积神经网络。一维卷积神经网络主要用于序列类的数据处理&#xff…