参考:
https://blog.csdn.net/weixin_42451919/article/details/81381294
https://blog.csdn.net/yjl9122/article/details/70198357?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://www.jianshu.com/p/1ea2949c0056
(结合《机器学习》5.1-5.2节)
感知机由两层神经元组成,分别为输入层与输出层(M-P神经元),是二元线性分类器。神经网络是以感知机为单元的集合。
如上图所示,输入 x1 和 x2 分别和各自的权重 w1 和 w2 相乘、求和,所以函数 f=x1w1+x2w2+b(偏置项,可以选择性地添加)。函数 f 可以是任意的运算,但是对于感知机而言通常是求和。函数 f 随后会通过一个激活函数来评估,该激活函数能够实现期望分类。Sigmoid 函数是用于二元分类的最常见的激活函数。(输出层/M-P神经元 = 函数 f + 激活函数)
把多个输入堆叠在一起,并且使用函数 f 将其与位于另一层的多个堆叠在一起的单元连接在一起,这就形成了多个全连接的感知机;隐藏层单元的输出成为最后一个单元的输入,再通过函数 f 和激活函数得到最终的分类。
神经网络的分类:
如下图所示,这个就是最简单的神经网络/前馈神经网络。当数百个输入连接到数个这样的隐藏层,则会形成一个复杂的神经网络,通常被称为深度神经网络或者深度前馈神经网络。
神经网络被称作泛逼近函数(Universal Approximation function),其拓扑和结构变体是很多样化的,因此神经网络可以模拟任何函数。
四种基本的神经网络架构:
卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元。由INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)组成,最后进行分类或回归。
卷积神经网络的层级结构
该层主要是对原始图像数据进行预处理,其中包括:
由若干卷积核/滤波器组成,其目的是在原始的输入上进行特征提取,即在原始输入上一个小区域一个小区域进行特征的提取。
名词解释
滤波器(filter):用于提取图像特征,它使用优化算法来决定矩阵中的权重参数。可在神经网络的一层卷积操作中使用多个滤波器来提取多个特征(一个滤波器提取一个特征/得到一个特征图)。此外,滤波器的深度必须和输入图像的深度相同。
输入图像大小(Input Size):要求为整数。
滤波器的大小(Kernel Size):要求为整数或者列表等。
步长(Stride):滤波器窗口滑动的大小。
填充(Zero-padding):零填充指在输入图像的边界周围补充零,以使尽可能多地保留原始输入内容的信息,或直接使输入图像和卷积后的特征图具有相同的维度。一般F=3 => zero pad with 1、F=5 => zero pad with 2、F=7=> zero pad with 3
输出图像大小(Output Size):Output_size = 1 + ( Input_size + 2 * Padding - Kernel_size ) / Stride
感受野/窗口(Receptive Field):卷积神经网络每一层输出的特征图上每个像素点在原始图像上映射的区域大小。其值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。
单色图像的卷积
假设一张单色图像有 5x5 个像素,1 代表白,0 代表黑。用一个由随机地 0 和 1 组成的 3x3 矩阵(即滤波器)去和图像中的子区域做乘法,每次迭代移动一个像素,这样该乘法会得到一个新的 3x3 的矩阵。下面的动图展示了这个过程。
RGB图像的卷积
RGB图像是三通道,即其深度为3(即R、G、B),由于滤波器的深度必须和输入图像的深度相同,因此滤波器的深度也为3。
下图展示了使用两个三通道滤波器从三通道(RGB)图像中生成两个卷积输出的详细过程,输出是提取到的特征。
下图是用了两个filter得到了两个特征图,输入图像是32x32x3,卷积层是一个5x5x3的Filter。通过一个Filter与输入图像的卷积可以得到一个28x28x1的特征图。
下图使用了6个Filter分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果(深度为6)。
卷积不仅限于对原始输入的卷积。蓝色方块是在原始输入上进行卷积操作,使用了6个filter得到了6个提取特征图。绿色方块还能对蓝色方块进行卷积操作,使用了10个filter得到了10个特征图。每一个filter的深度必须与上一层输入的深度相等。
如下图,第一次卷积可以提取出低层次的特征,第二次卷积可以提取出中层次的特征,第三次卷积可以提取出高层次的特征。特征是不断进行提取和压缩的,最终能得到比较高层次特征,简言之就是对原式特征一步又一步的浓缩,最终得到的特征更可靠。利用最后一层特征可以做各种任务:比如分类、回归等。
卷积层的输出尺寸
输 出 宽 度 / 高 度 = 1 + ( 输 出 宽 度 / 高 度 + 2 × 填 充 − 滤 波 器 宽 度 / 高 度 ) 移 动 步 长 输出宽度/高度 = 1 + \frac{ ( 输出宽度/高度 + 2 \times 填充 - 滤波器宽度/高度 ) }{移动步长} 输出宽度/高度=1+移动步长(输出宽度/高度+2×填充−滤波器宽度/高度)
如下图:
权值共享机制
当用一个filter去扫一张输入图像,filter里面的数叫权重,这张图每个位置是被同样的filter扫的,所以权重是一样的,也就是共享。
同上图,特征图由10个32x32x1的特征图组成,即每个特征图上有32x32x1=1024个神经元,每个神经元对应输入图像上一块5x5x3的区域,即一个神经元和输入图像的这块区域有5x5x3=75个连接,即75+1=76个权值参数(+1是偏置项bias),则共有76x1024x10=778240个权值参数,这是非常复杂的。
引入权值共享机制后,即一个特征图上每个神经元对应的76个权值参数被每个神经元共享,这样则只需76x10=760个权值参数,而每个特征图内的阈值也共享,即需要10个阈值,则总共需要760+10=770个参数。
在每个卷积层之后,通常会立即应用一个非线性层(激活函数),其目的是给一个在卷积层中刚经过线性计算操作(只是数组元素依次相乘与求和)的系统引入非线性特征。
激活函数应该具有的性质: 目前常用的激活函数都只拥有下述性质的部分
常见的激活函数:
Sigmoid函数(目前已被淘汰)
S i g m o i d ( x ) = 1 1 + e − x Sigmoid(x) = \frac 1{1+e^{-x}} Sigmoid(x)=1+e−x1
缺点:
① 饱和时梯度值非常小。
由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,导致网络较底层的训练速度非常慢,即梯度耗散/梯度消失。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。
② 输出值不是以0为中心值。
Tanh函数
T a h n ( x ) = 2 σ ( 2 x ) − 1 Tahn(x) = 2σ(2x)-1 Tahn(x)=2σ(2x)−1
其中σ(x)为sigmoid函数,仍然具有饱和的问题。
ReLU函数
Alex在2012年提出的一种新的激活函数,很大程度的解决了BP算法在优化深层神经网络时的梯度耗散问题。最常用,也称为线性整流函数/修正线性单元,注意学习率的设置以及死亡节点所占的比例即可。
R e L U ( x ) = m a x ( 0 , x ) ReLU(x) = max(0,x) ReLU(x)=max(0,x)
ReLU函数把所有的负激活(negative activation)都变为零,其图像如下:优点:
① x>0时,求梯度简单,梯度恒为1,无梯度耗散/梯度消失问题,收敛快。
② 增大了网络的稀疏性。当x<0时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就越具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好。
③ 运算量很小,在准确度不发生明显改变的情况下能令训练速度提高很多,计算效率增加。
缺点:
① 较脆弱,如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。
② 由优缺点可知max(0,x) 函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,需要trade-off。
Leaky ReLU/PReLU函数
对于Leaky ReLU,a是固定的,是模型训练前提前设定的;对于PReLU,a是未知的,是模型训练中得到的。总结为Leaky ReLU中a是超参数,PReLU中a是参数。
L e a k y R e L U / P R e L U ( x ) = { x , x ≥ 0 a x , x < 0 Leaky\ ReLU/PReLU(x) = \begin{cases} x,\ \ \ \ x\geq0 \\ ax,\ \ x<0 \end{cases} Leaky ReLU/PReLU(x)={x, x≥0ax, x<0
a 处于(0,1)区间内。Leaky ReLU/PReLU函数改善了ReLU的死亡特性,但是也同时损失了一部分稀疏性,且增加了一个超参数/参数,目前来说其好处不太明确。
Maxout函数
M a x o u t ( x ) = m a x ( w 1 T x + b 1 , w 2 T x + b 2 , . . . , w k T x + b k ) Maxout(x) = max(w^T_1x+b_1, w^T_2x+b_2,...,w^T_kx+b_k) Maxout(x)=max(w1Tx+b1,w2Tx+b2,...,wkTx+bk)
泛化了ReLU和Leaky ReLU,改善了死亡特性,但是同样损失了部分稀疏性,每个非线性函数增加了两倍的参数。
激励层的实践经验
池化也称为下采样,池化层对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征,减小特征空间维度/降维,提供空间方差,但不会减小深度。
池化层的具体作用
两种池化操作:
其中,最大池化是两者中使用最多的一个操作,其效果一般要优于平均池化。当使用最大池化层时,采用输入区域的最大数量,而当使用平均池化时,采用输入区域的平均值。示例如下:
全连接层通常在卷积神经网络尾部,它将最后一个卷积层的输出展平,即把其拉成一个列项向量。全连接层中的每个神经元与其前一层的所有神经元进行全连接。全连接层可以整合卷积层或者池化层中具有类别区分性的局部信息,将输出值送给分类器(如softmax分类器)。
全连接层的参数
全连接层参数特多,可占整个网络参数80%左右。
例子1:
经过卷积、ReLU后得到3x3x5的输出,全连接层如何把3x3x5的ReLU输出转换成1x4096的形式?
如上图,全连接层中的每一层是由许多神经元组成的(1x4096)的平铺结构。
如下图,分别用4096个3x3x5的filter(与ReLU输出相同尺寸)去卷积ReLU输出(相加求和得到1个值),每个filter卷积得到的结果就是全连接层的1个神经元的输出,这个输出就是1个值,最后得到4096个值。
例子2:
如下图,最后的两列小圆球就是两个全连接层,在最后一层卷积结束后,进行了最后一次池化,输出了20x12x12的特征图,然后通过了一个全连接层变成了100x1的向量。全连接层中有100个20x12x12的卷积核,对于输入的每一张特征图,用了一个和特征图一样大小的核卷积,如果厚度是20就是用20个核卷积完了之后相加求和,这样整幅图就变成了一个数了。
全连接层的目的
全连接层实现分类,并大大减少特征位置对分类带来的影响。
从上图可以看出,猫在不同的位置,输出的特征值相同,但是位置不同。对于电脑来说,特征值相同,但是特征值位置不同,那分类结果也可能不一样。这时全连接层filter的作用就相当于“喵在哪我不管,我只要喵”,即把特征图整合成一个值,若这个值大,则有喵,若这个值小,则可能没喵,结果和这个喵在哪关系不大了,鲁棒性有大大增强。
但因为空间结构特性被忽略了,所以全连接层不适合用于在方位上找Pattern的任务,比如segmentation。
多层全连接层
全连接层中一层的一个神经元就可以看成一个多项式,可用许多神经元去拟合数据分布,但是只用一层全连接层有时候没法解决非线性问题,而如果有两层或以上全连接层就可以很好地解决非线性问题了。
注意:
全连接层的权重矩阵是固定的,即每一次特征图的输入过来必须都得是一定的大小(即与权重矩阵正好可以相乘的大小),所以网络最开始的输入图像尺寸必须固定,才能保证传送到全连接层的特征图的大小跟全连接层的权重矩阵匹配。
1.INPUT
2.[[CONV -> RELU]*N -> POOL]*M
3.[FC -> RELU]*K
4.FC
优点
缺点
fine-tuning:由于数据集不够大,很少有人从头开始训练网络,因此使用已用于其他目标、预训练好模型的权重或者部分权重,作为初始值开始训练。
为什么不用随机选取选几个数作为权重初始值
fine-tuning的具体做法
Caffe
PyTorch
TensorFlow