https://blog.csdn.net/qq_39056987/article/details/112157031?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
https://zhuanlan.zhihu.com/p/113285797
https://blog.csdn.net/e01528/article/details/89313518?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control
《深度学习之Pytorch物体检测》
线性归一化(min-max标准化)
x’ = (x-min(x)) / (max(x)-min(x)),其中max是样本数据的最大值,min是样本数据的最小值
适用于数值比较集中的情况,可使用经验值常量来来代替max,min
标准差归一化(z-score 0均值标准化)
x’=(x-μ) / σ,其中μ为所有样本的均值,σ为所有样本的标准差
经过处理后符合标准正态分布,即均值为0,标准差为1
非线性归一化
使用非线性函数log、指数、正切等,如y = 1-e^(-x),在x∈[0, 6]变化较明显, 用在数据分化比较大的场景
H height = ⌊ Input height − Filter height + 2 × padding stride + 1 ⌋ W width = ⌊ Input width − Filter width + 2 × padding stride + 1 ⌋ \begin{array}{l} H_{\text {height }}=\left\lfloor\frac{\text { Input height }-\text { Filter }_{\text {height }}+2 \times \text { padding }}{\text { stride }}+1\right\rfloor \\ W_{\text {width }}=\left\lfloor\frac{\text { Input width }-\text { Filter width }+2 \times \text { padding }}{\text { stride }}+1\right\rfloor \end{array} Hheight =⌊ stride Input height − Filter height +2× padding +1⌋Wwidth =⌊ stride Input width − Filter width +2× padding +1⌋
一般每一层的卷积核都是用 [公式] 大小的,而每一层只要设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息,当然这样操作并不影响特征图的尺寸,这样一来,又避免下采样那样造成信息损失,同时也利用到多尺度信息。
假设空洞卷积的卷积核大小为 k k k ,空洞数为 d d d ,则其等效卷积核大小 k ′ k' k′ ,则
k ′ = k + ( k − 1 ) ( d − 1 ) k'=k+(k-1)(d-1) k′=k+(k−1)(d−1)
当前层的感受野计算公式如下,其中, R F i + 1 RF_{i+1} RFi+1表示当前层的感受野, , R F i RF_{i} RFi表示上一层的感受野, k ′ k' k′ 表示卷积核的大小
R F i + 1 = R F i + ( k ′ − 1 ) S i RF_{i+1} = RF_{i}+(k'-1)S_i RFi+1=RFi+(k′−1)Si
S i S_i Si表示之前所有层的步长的乘积(不包括本层),公式如下:
S i = ∏ i = 1 i Stride i S_{i}=\prod_{i=1}^{i} \text { Stride }_{i} Si=i=1∏i Stride i
(1)棋盘格效应
由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖,因此该层的卷积结果之间没有相关性,即局部信息丢失。这对 pixel-level dense prediction 的任务来说是致命的。
(2)远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。
可以使用跨层连接上采样弥补信息。
在使用线性回归的时候的基本假设是噪声服从正态分布,当噪声符合正态分布N(0,delta2)时,因变量则符合正态分布N(ax(i)+b,delta2),其中预测函数y=ax(i)+b。这个结论可以由正态分布的概率密度函数得到。也就是说当噪声符合正态分布时,其因变量必然也符合正态分布。因此,我们使用mse的时候实际上是假设y服从正态分布的。
具体地:在解决这个问题的时候,我们使用最大似然估计进行求解系数。在求解对数似然函数的时候,由于高斯分布由平方项,会导致最终的求解结果是MSE。
在构建模型的过程中,通常会划分训练集、测试集。
当模型在训练集上精度很高,在测试集上精度很差时,模型过拟合;当模型在训练集和测试集上精度都很差时,模型欠拟合。
参考链接
(1)BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度
BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的变化,从而实现了网络中层与层之间的解耦,更加有利于优化的过程,提高整个神经网络的学习速度。
(2)BN使得模型对初始化方法和网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
(3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
在不使用BN层的时候,由于网络的深度与复杂性,很容易使得底层网络变化累积到上层网络中,导致模型的训练很容易进入到激活函数的梯度饱和区;通过normalize操作可以使得参数值落到0附近,也就是梯度非饱和区,缓解梯度消失的问题。
(4)BN具有一定的正则化效果
在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。原作者也证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。
(5)用上BN层之后可以使用更大的学习率,从而跳出不好的局部极值,增强泛化能力。
原文中是这样解释的,因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移,相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。其实想想也是的,像relu这样的激活函数,如果你输入的数据是一个高斯分布,经过他变换出来的数据能是一个什么形状?小于0的被抑制了,也就是分布小于0的部分直接变成0了,这样不是很高斯了。
基本梯度下降法,包括 GD,BGD,SGD;
动量优化法,包括 Momentum,NAG 等;
自适应学习率优化法,包括 Adam,AdaGrad,RMSProp 等
参考链接
Momentum --> Nesterov Momentum
AdaGrad --> RMSProp --> AdaDelta
Adam是Momentum与RMSProp的一个结合体
Adam --> AdaMax
Nesterov与AdaMax结合变成NadaMax
NAdam是Nesterov Momentum与RMSProp组合
Momentum是在前面简单的梯度下降上添加一个动量,从物理角度上看就是给了它一个惯性,使得在一直下落的路上,速度越来越快,而在遇到局部最优,有可能借着惯性冲出去。
优点:使得物体的震荡减弱,更快地运动到最优解
v i = α v i − 1 + ( 1 − α ) g i Δ w = − η v i \begin{aligned} v_{i} &=\alpha v_{i-1}+(1-\alpha) g_{i} \\ \Delta w &=-\eta v_{i} \end{aligned} viΔw=αvi−1+(1−α)gi=−ηvi
Adam的名称来自Adaptive Momentum,可以看作是Momentum与RMSProp的一个结合体,该算法通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
s i = α s i − 1 + ( 1 − α ) g i r i = β r i − 1 + ( 1 − β ) g i , 2 s ^ i = s i 1 − α i r ^ i = r i 1 − β i Δ w = − η s ^ i r ^ i + ϵ w = w + Δ w \begin{aligned} s_{i} &=\alpha s_{i-1}+(1-\alpha) g_{i} \\ r_{i} &=\beta r_{i-1}+(1-\beta) g_{i,}^{2} \\ \hat{s}_{i} &=\frac{s_{i}}{1-\alpha^{i}} \\ \hat{r}_{i} &=\frac{r_{i}}{1-\beta^{i}} \\ \Delta w &=-\eta \frac{\hat{s}_{i}}{\sqrt{\hat{r}_{i}+\epsilon}} \\ w &=w+\Delta w \end{aligned} siris^ir^iΔww=αsi−1+(1−α)gi=βri−1+(1−β)gi,2=1−αisi=1−βiri=−ηr^i+ϵs^i=w+Δw
常规的SGD
Δ w = − η J ′ ( w ) \Delta w=-\eta J^{\prime}(w) Δw=−ηJ′(w)
不过相比SGD,用的更多的还是小批量梯度下降(mBGD)算法,不同之处在于一次训练使用多个样本,然后取所有参与训练样本梯度的平均来更新参数,公式如下:
Δ w = − η g i g i = 1 m ∑ k = 1 m J ′ ( w ) \begin{aligned} \Delta w &=-\eta g_{i} \\ g_{i} &=\frac{1}{m} \sum_{k=1}^{m} J^{\prime}(w) \end{aligned} Δwgi=−ηgi=m1k=1∑mJ′(w)
注意:随机梯度下降(SGD)是指每次随机挑选一个样本用于梯度下降;批量梯度下降(BGD)是指每次使用所有样本用于梯度下降;小批量梯度下降(mBGD)是指每次挑选一部分样本用于梯度下降,当遍历完所有的训练数据,称之为一个epoch。一般程序里都是用的mBGD。
AdaGrad全称为Adaptive Subgradient,其主要特点在于不断累加每次训练中梯度的平方。
自适应地为各个参数分配不同学习率的算法。
r i = r i − 1 + g i 2 Δ w = − η ϵ + r i g i w = w + Δ w \begin{aligned} r_{i} &=r_{i-1}+g_{i}^{2} \\ \Delta w &=-\frac{\eta}{\epsilon+\sqrt{r_{i}}} g_{i} \\ w &=w+\Delta w \end{aligned} riΔww=ri−1+gi2=−ϵ+riηgi=w+Δw
缺点:梯度会急剧下降
RMSProp是AdaGrad的改进算法
r i = β r i − 1 + ( 1 − β ) g i 2 Δ w = − η ϵ + r i g i w = w + Δ w \begin{aligned} r_{i} &=\beta r_{i-1}+(1-\beta) g_{i}^{2} \\ \Delta w &=-\frac{\eta}{\epsilon+\sqrt{r_{i}}} g_{i} \\ w &=w+\Delta w \end{aligned} riΔww=βri−1+(1−β)gi2=−ϵ+riηgi=w+Δw
感受野指的是卷积神经网络每一层输出的特征图上每个像素点映射回输入图像上的区域的大小,神经元感受野的范围越大表示其接触到的原始图像范围就越大,也就意味着它能学习更为全局,语义层次更高的特征信息,相反,范围越小则表示其所包含的特征越趋向局部和细节。因此感受野的范围可以用来大致判断每一层的抽象层次,并且我们可以很明显地知道网络越深,神经元的感受野越大。
卷积层的感受野大小与其之前层的卷积核尺寸和步长有关,与padding无关。
第i层特征图上的点在第i-1层上的感受野公式:
R F [ i − 1 ] = ( R F [ i ] − 1 ) ∗ stride [ i − 1 ] + ksize [ i − 1 ] RF[i-1]=(RF[i]-1) * \text { stride }[i-1]+\text { ksize }[i-1] RF[i−1]=(RF[i]−1)∗ stride [i−1]+ ksize [i−1]如果当前要求第n层的特征图的感受野,初始 R F [ n ] = 1 RF[n] = 1 RF[n]=1.
神经网络的深度决定了网络的表达能力,早期的backbone设计都是直接堆叠卷积层,它的深度指的是神经网络的层数;后来的backbone设计采用了更高效的module(或block)堆叠的方式,每个module是由多个卷积层组成,这时深度指的是module的个数。
神经网络的宽度决定了网络在某一层学习到的信息量,指的是卷积神经网络中最大的通道数,由卷积核数量最多的层决定。通常的结构设计中卷积核的数量随着层数越来越多的,直到最后一层feature map达到最大,这是因为越到深层,feature map的分辨率越小,所包含的信息越高级,所以需要更多的卷积核来进行学习。通道越多效果越好,但带来的计算量也会大大增加,所以具体设定也是一个调参的过程,并且各层通道数会按照8×的倍数来确定,这样有利于GPU的并行计算。
下采样层有两个作用,一是减少计算量,防止过拟合;二是增大感受野,使得后面的卷积核能够学到更加全局的信息。下采样的方式主要有两种:
https://blog.csdn.net/weixin_41683218/article/details/86473488
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的,图示如下
max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id。
在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样,它的实现一般有三种方式:
插值,一般使用的是双线性插值,因为效果最好,虽然计算上比其他插值方式复杂,但是相对于卷积计算可以说不值一提,其他插值方式还有最近邻插值、三线性插值等;
转置卷积又或是说反卷积,通过对输入feature map间隔填充0,再进行标准的卷积计算,可以使得输出feature map的尺寸比输入更大;
Max Unpooling,在对称的max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余位置补0;
深度可分离卷积将传统的卷积分两步进行,分别是depthwise和pointwise。首先按照通道进行计算按位相乘的计算,深度可分离卷积中的卷积核都是单通道的,输出不能改变feature map的通道数,此时通道数不变;然后依然得到将第一步的结果,使用1*1的卷积核进行传统的卷积运算,此时通道数可以进行改变。
https://www.jianshu.com/p/6db4e6e2b7a7
转置卷积又称反卷积(Deconvolution),它和空洞卷积的思路正好相反,是为上采样而生,也应用于语义分割当中,而且他的计算也和空洞卷积正好相反,先对输入的feature map间隔补0,卷积核不变,然后使用标准的卷积进行计算,得到更大尺寸的feature map。
Addition和Concatenate分支操作统称为shortcut,Addition是在ResNet中提出,两个相同维度的feature map相同位置点的值直接相加,得到新的相同维度feature map,这个操作可以融合之前的特征,增加信息的表达,Concatenate操作是在Inception中首次使用,被DenseNet发扬光大,和addition不同的是,它只要求两个feature map的HW相同,通道数可以不同,然后两个feature map在通道上直接拼接,得到一个更大的feature map,它保留了一些原始的特征,增加了特征的数量,使得有效的信息流继续向后传递。
参考链接
ReLU、ReLU6和leaky ReLU;ReLU6与ReLU相比也只是在正向部分多了个阈值,大于6的值等于6,而leaky ReLU和ReLU正向部分一样,都是大于0等于原始值,但负向部分却是等于原始值的1/10,浮点运算的话乘个0.1就好了。
ReLU函数的优点:
ReLU函数的缺点:
Sigmoid、swish、h-sigmoid、h-swish;sigmoid对低性能的硬件来说非常不友好,因为涉及到大量的exp指数运算和除法运算,于是有研究人员针对此专门设计了近似的硬件友好的函数h-sigmoid和h-swish函数,这里的h指的就是hardware的意思。
tanh x = sinh x cosh x = e x − e − x e x + e − x \tanh x=\frac{\sinh x}{\cosh x}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanhx=coshxsinhx=ex+e−xex−e−x
tanh函数的优点:
tanh函数的缺点:
f ( x ) = { α ( e x − 1 ) , x ≤ 0 x , x > 0 f ′ ( x ) = { f ( x ) + α , x ≤ 0 1 , x > 0 \begin{array}{l} f(x)=\left\{\begin{array}{ll} \alpha\left(e^{x}-1\right), & x \leq 0 \\ x, & x>0 \end{array}\right. \\ f^{\prime}(x)=\left\{\begin{array}{ll} f(x)+\alpha, & x \leq 0 \\ 1, & x>0 \end{array}\right. \end{array} f(x)={α(ex−1),x,x≤0x>0f′(x)={f(x)+α,1,x≤0x>0
softplus: f ( x ) = log ( 1 + e x ) f(x) = \log \left(1+e^{x}\right) f(x)=log(1+ex)
softplus函数与ReLU函数接近,但比较平滑, 同ReLU一样是单边抑制,有宽广的接受域(0,+inf), 但是由于指数运算,对数运算计算量大的原因,而不太被人使用.并且从一些人的使用经验来看(Glorot et al.(2011a)),效果也并不比ReLU好. softplus的导数恰好是sigmoid函数。
Leaky ReLU: f ( x ) = max ( α x , x ) f(x)=\max (\alpha x, x) f(x)=max(αx,x)
当固定为α=0.01α=0.01时,是Leaky ReLU。当 αα 从高斯分布中随机产生时称为Random Rectifier(RReLU)。将 α 作为可学习的参数,称为Parametric Rectifier(PReLU)。
Maxout激活函数
与常规激活函数不同的是,它是一个可学习的分段线性函数.
然而任何一个凸函数,都可以由线性分段函数进行逼近近似。其实我们可以把以前所学到的激活函数:ReLU、abs激活函数,看成是分成两段的线性函数。实验结果表明Maxout与Dropout组合使用可以发挥比较好的效果。
Maxout
Maxout可以看做是在深度学习网络中加入一层激活函数层,包含一个参数k。这一层相比ReLU,sigmoid等,其特殊之处在于增加了k个神经元,然后输出激活值最大的值。
swish: f ( x ) = x ⋅ sigmoid ( β x ) f(x)=x \cdot \operatorname{sigmoid}(\beta x) f(x)=x⋅sigmoid(βx)
β是个常数或可训练的参数.Swish 具备无上界有下界、平滑、非单调的特性。 Swish 在深层模型上的效果优于 ReLU。
SELU(自归一化线性单元):是给ELU乘上系数 λλ, 即 SELU(x)=λ⋅ELU(x)
f ( x ) = λ { α ( e x − 1 ) x ≤ 0 x x > 0 f(x)=\lambda\left\{\begin{array}{ll} \alpha\left(e^{x}-1\right) & x \leq 0 \\ x & x>0 \end{array}\right. f(x)=λ{α(ex−1)xx≤0x>0
GELU(高斯误差线性单元)
参考
https://zhuanlan.zhihu.com/p/72589432
当处理大量数据时,比如SSD或者faster-rcnn等目标检测算法,每个样本都有大量候选框参与训练,这时使用随机梯度下降法能够加快梯度的计算;
每次只随机选取一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新。
在前向传播和反向传播过程中,ReLU相比于Sigmoid等激活函数计算量小;
在反向传播过程中,Sigmoid函数存在饱和区,若激活值进入饱和区,则其梯度更新值非常小,导致出现梯度消失的现象。而ReLU没有饱和区,可避免此问题;
ReLU可令部分神经元输出为0,造成网络的稀疏性,减少前后层参数对当前层参数的影响,提升了模型的泛化性能;
一阶的有:梯度下降法GD、SGD、ASGD、指数加权平均AdaDelta、RMSProp、Adam
二阶的有:牛顿法、拟牛顿法(二阶收敛更快)
基础概念:
但相比于一阶梯度,二阶优化问题:
(1)计算量大,训练非常慢。
(2)二阶方法能够更快地求得更高精度的解,这在浅层模型是有益的。而在神经网络这类深层模型中对参数的精度要求不高,甚至不高的精度对模型还有益处,能够提高模型的泛化能力。
(3)稳定性。越简单的模型越robust。
知乎
参考链接
batch normalization存在以下缺点:
对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;
BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。
与BN不同,LN是针对深度网络的某一层的所有神经元的输入按以下公式进行normalize操作。
BN与LN的区别在于:
LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;
BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。
所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。
μ l = 1 H ∑ i = 1 H a i l σ l = 1 H ∑ i = 1 H ( a i l − μ l ) 2 \mu^{l}=\frac{1}{H} \sum_{i=1}^{H} a_{i}^{l} \quad \sigma^{l}=\sqrt{\frac{1}{H} \sum_{i=1}^{H}\left(a_{i}^{l}-\mu^{l}\right)^{2}} μl=H1i=1∑Hailσl=H1i=1∑H(ail−μl)2
BN与LN的区别在于:
所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。
LN用于RNN效果比较明显,但是在CNN上,不如BN。
BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布。
但是图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
y t i j k = x t i j k − μ t i σ t i 2 + ϵ , μ t i = 1 H W ∑ l = 1 W ∑ m = 1 H x t i l m , σ t i 2 = 1 H W ∑ l = 1 W ∑ m = 1 H ( x t i l m − m u t i ) 2 . y_{t i j k}=\frac{x_{t i j k}-\mu_{t i}}{\sqrt{\sigma_{t i}^{2}+\epsilon}}, \quad \mu_{t i}=\frac{1}{H W} \sum_{l=1}^{W} \sum_{m=1}^{H} x_{t i l m}, \quad \sigma_{t i}^{2}=\frac{1}{H W} \sum_{l=1}^{W} \sum_{m=1}^{H}\left(x_{t i l m}-m u_{t i}\right)^{2} . ytijk=σti2+ϵxtijk−μti,μti=HW1l=1∑Wm=1∑Hxtilm,σti2=HW1l=1∑Wm=1∑H(xtilm−muti)2.
主要是针对Batch Normalization对小batchsize效果差,GN将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值,这样与batchsize无关,不受其约束。
本篇论文作者认为,
因此作者提出自适配归一化方法——Switchable Normalization(SN)来解决上述问题
只要激活函数选择得当,神经元的数量足够,至少有一个隐含层的神经网络可以逼近闭区间上任意一个连续函数到任意指定的精度。
参考链接
简单说来,各种"距离"的应用场景简单概括为:
搬运自《深度学习之Pytorch物体检测》
搬运自《深度学习之Pytorch物体检测》
在训练时, 每个神经元以概率p保留, 即以1-p的概率停止工作, 每次前向传播保留下来的神经元都不同, 这样可以使得模型不太依赖于某些局部特征, 泛化性能更强。在测试时, 为了保证相同的输出期望值, 每个参数还要乘以p。当然还有另外一种计算方式称为Inverted Dropout, 即在训练时将保留下的神经元乘以1/p, 这样测试时就不需要再改变权重。
https://blog.csdn.net/normol/article/details/84322626
SqueezeNet, 其性能与AlexNet相近, 而模型参数仅有AlexNet的1/50。
使用了如下3点策略来减少网络参数, 提升网络性能:
SqueezeNet提出了如下图所示的基础模块, 称之为Fire Module。
如图所示:
SqueezeNet整体结构:
SqueezeNet一共使用了3个Pool层,前两个是Max Pooling层,步长为2,最后一个为全局平均池化,利用该层可以取代全连接层,减少了计算量。
度可分离卷积将卷积过程分为了两步,凭借其轻量的卷积方式,总体计算量约等于标准卷积的1/9。
MobileNet v1使用的深度可分离模块的具体结构如图所示。 其中使用了BN层及ReLU的激活函数。 值得注意的是, 在此使用了ReLU6来替代原始的ReLU激活函数, 将ReLU的最大输出限制在6以下。
使用ReLU6的原因主要是为了满足移动端部署的需求。 移动端通常使用Float16或者Int8等较低精度的模型, 如果不对激活函数的输出进行限制的话, 激活值的分布范围会很大, 而低精度的模型很难精确地覆盖如此大范围的输出, 这样会带来精度的损失。
在基本的结构之外, MobileNet v1还设置了两个超参数, 用来控制模型的大小与计算量, 具体如下:
MobileNet v1也有其自身结构带来的缺陷, 主要有以下两点:
(1)Inverted Residual Block结构
(2)去掉ReLU6
2017年的ShuffleNet v1从优化网络结构的角度出发, 利用组卷积与通道混洗(Channel Shuffle) 的操作有效降低了1×1逐点卷积的计算量,是一个极为高效的轻量化网络。 而2018年的ShuffleNet v2则在ShuffleNetv1版本的基础上实现了更为优越的性能, 本节将详细介绍这两个ShuffleNet网络的思想与结构。
逐点的1×1卷积有如下两点特性:
为了进一步降低计算量,ShuffleNet提出了通道混洗的操作, 通过通道混洗也可以完成通道之间信息的融合。
shuffleNet v1的基本结构:
其中DWConv表示深度可分离卷积;GConv表示分组卷积。
ShuffleNet v2做了大量的实验, 分析影响网络运行速度的原因, 提出了建立高性能网络的4个基本规则:
(1) 卷积层的输入特征与输出特征通道数相等时, 内存访问时间(Memory Access Cost, MAC) 最小, 此时模型速度最快。
(2) 过多的组卷积会增加MAC, 导致模型的速度变慢。
(3) 网络的碎片化会降低可并行度, 这表明模型中分支数量越少, 模型速度会越快。
(4) 逐元素(Element Wise) 操作虽然FLOPs值较低, 但其MAC较高, 因此也应当尽可能减少逐元素操作。
以这4个规则为基础, 可以看出ShuffleNet v1有3点违反了此规则:
https://blog.csdn.net/qq_35975753/article/details/108801408
https://blog.csdn.net/weixin_43578873/article/details/104517029
注意力机制(attention)的基本思想就是想让系统学会注意力——能够忽略无关信息而关注重点信息。注意力机制一种是软注意力(soft attention),另一种则是强注意力(hard attention)。
分别对特征图进行全局最大池化和全局平均池化,然后分别将这两个特征向量输入同一个MLP网络中,最后将得到的两个结果逐点相加并进行sigmoid归一化。
对特征图分别进行局部最大池化和局部平均池化,并缩减输出通道数。将这两个输出结果沿通道数进行拼接,然后经过一个卷积层并进行sigmoid归一化。
CBAM模块就是把通道注意力机制和空间注意力机制串联起来。需要注意的是通道注意力机制和空间注意力机制都是范围0-1的,都是扮演加权系数的角色。只是一个通道加权,一个给空间加权。
Self-attention结构自上而下分为三个分支,分别是query、key和value。计算时通常分为三步:
第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
第二步一般是使用一个softmax函数对这些权重进行归一化;
第三步将权重和相应的键值value进行加权求和得到最后的attention。
卷积操作和递归操作都是构建块,一次处理一个局部邻居,在此文中,作者将非局部操作作为捕获远程依赖项的构建块的一个通用族来表示。受传统算法非局部均值启发,非局部操作用所有位置特征的加权来作为一个位置的响应。
https://blog.csdn.net/qq_39056987/article/details/112104199
https://mp.weixin.qq.com/s/Y2e1JF8qrA5TaNlMk8fFJA
https://mp.weixin.qq.com/s/Ml9MrdbgxRZAnLYxIrev4Q
https://github.com/amusi/Deep-Learning-Interview-Book/blob/master/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89.md
https://github.com/GYee/CV_interviews_Q-A
https://github.com/amusi/Deep-Learning-Interview-Book/blob/master/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89.md