CNN
CNN(Convolutional Neural Networks,CNN)中文名称卷积神经网络。
通常,当我们使用全连接神经网络时,权重矩阵的参数非常多。它使整个网络收敛非常缓慢。然而,自然图像处理具有局部不变性的特点,即尺度缩放、平移、旋转等操作不影响其语义信息,但全连接前馈网络难以提取这些局部不变性特征。所以介绍CNN。
CNN也是前馈神经网络,它最大的区别是受生物学上感受野的启发,引入了卷积核的概念。
卷积
卷积是一种连续卷积和离散卷积的计算方法。 { ( f ? g ) ( n ) = ∫ ? ∞ ∞ f ( τ ) g ( n ? τ ) d τ n = τ ( n ? τ ) ( f ? g ) ( n ) = ∑ τ = ? ∞ ∞ f ( τ ) g ( n ? τ ) \begin{cases} (f*g)(n)=\int_{-\infty}^{\infty}f(\tau)g(n-\tau)d\tau \\ n=\tau (n-\tau) (f*g)(n)=\sum^{\infty}_{\tau=-\infty}f(\tau)g(n-\tau) \end{cases} { (f?g)(n)=∫?∞∞f(τ)g(n?τ)dτn=τ (n?τ)(f?g)(n)=∑τ=−∞∞f(τ)g(n−τ) 卷积有很多应用,经常用于处理一个输入,通过系统产生一个适应需求的输出。是用于计算信号的延迟累计的一种手段
- 统计学中加权平均法
- 概率论中两个独立变量之和概率密度的计算
- 信号处理中的线性系统
- 物理学的线性系统
- 图像处理中的应用(卷积神经网络)
例如,假设一个信号发生器每个时刻t产生一个信号x,其信息的衰减率为w。即在k-1个时间步长后,信息为原来的w倍。假设w_1=1,w_2=1/2,w_3=1/4,则时刻t收到的信号y_t为当前hi为当前时刻产生的信息和以前时刻延迟信息的叠加,即: y = 1 ∗ x t + 1 / 2 ∗ x t − 1 + 1 / 4 ∗ x t − 2 = ω 1 ∗ x t + ω 2 ∗ x t − 1 + ω 3 ∗ x t − 2 = ∑ k = 1 3 ω k ∗ x t − k + 1 y=1*x_t+1/2*x_{t-1}+1/4*x_{t-2} \\ =\omega_1*x_t+\omega_2*x_{t-1}+\omega_3*x_{t-2} \\ =\sum^{3}_{k=1} \omega_k*x_{t-k+1} y=1∗xt+1/2∗xt−1+1/4∗xt−2=ω1∗xt+ω2∗xt−1+ω3∗xt−2=k=1∑3ωk∗xt−k+1
其中w就是滤波器,也就是常说的卷积核(Convolution Kernel)
给定一个输入信号x和滤波器w,卷积输出为: y y = ∑ k = 1 K ω k x t − k + 1 y_y=\sum^{K}_{k=1}\omega_kx_{t-k+1} yy=k=1∑Kωkxt−k+1 而不同的滤波器提取出来的序列也有不同:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPAww0VG-1638018363661)(https://datawhalechina.github.io/unusual-deep-learning/PIC/5/3.png)]
步长与零
填充
下面引入滤波器的滑动步长S和零填充P:
卷积的结果按输出长度不同可分三类:
- 窄卷积:步长T=1,两端不补零P=0,卷积后输出长度是M-K+1
- 宽卷积:步长T=1,两端补零P=K-1,卷积后的长度是M+K-1
- 等宽卷积:步长T=1,两端补零P=(K-1)/2,卷积后输出长度M
在早期的文献中,卷积一般默认为窄卷积。而目前的文献中,卷积一般默认为等宽卷积。
卷积与图像
上面提到,卷积在图像处理中发挥着重要的左右。而图像一般是二维矩阵的形式输入神经网络中,因此我们需要使用。
下面给出定义:一个输入信息X和滤波器W的二维卷积为Y=W*X,既 y i j = ∑ u = 1 U ∑ v = 1 V ω u v x i − u + 1 , j − v + 1 y_{ij}=\sum^{U}_{u=1}\sum_{v=1}V\omega_{uv}x_{i-u+1,j-v+1} yij=u=1∑Uv=1∑Vωuvxi−u+1,j−v+1 实际如下图:
下图直接表示卷积层的映射关系
多个卷积核的情况:下图是表示步长2、filter 3*3 、filter个数6、零填充 1的情形。
几乎很多实际应用都可以对应到这个问题上,都是在做这样一件事
1)输入对应着rgb图片
2)一旦输入的特征图个数是多个,这个时候每一组filter就应该是多个,而这里有两组filter
3)输入是三个特征图,输出为两个特征图,那么我们同样看看每个特征图怎么计算的。
典型的卷积层为3维结构
其他卷积
转置卷积/微步卷积
低维特征映射到高维特征
空洞卷积
为了增加输出单元的感受野,通过给卷积核插入“空洞”来变相地增加其大小。
卷积神经网络基本原理
一般的卷积神经网络基本结构包括:、、、、、。当然,在某些特殊业务场景下,可能会基于简单的卷积网络结果添加其他的类似预训练模型、机器学习模型等操作。
下面将从卷积层开始介绍每一层的细节。
卷积层
二维卷积运算:给定二维的图片作为输入,卷积核为K,那么卷积的公式可以表示为: S ( i , j ) = ( I ∗ K ) ( i , j ) = ∑ m ∑ n I ( i − m , j − n ) K ( m , n ) S(i,j)=(I * K)(i,j)=\sum_m\sum_nI(i-m,j-n)K(m,n) S(i,j)=(I∗K)(i,j)=m∑n∑I(i−m,j−n)K(m,n) 绝技和需要进行上下翻转和左右翻转,所以 S ( i , j ) = ( [ I ( i − 2 , j − 2 ) I ( i − 2 , j − 1 ) I ( i − 2 , j ) I ( i − 1 , j − 2 ) I ( i − 1 , j − 1 ) I ( i − 1 , j ) I ( i , j − 2 ) I ( i , j − 1 ) I ( i , j ) ] ∗ [ K ( 2 , 2 ) K ( 2 , 1 ) K ( 2 , 0 ) K ( 1 , 2 ) K ( 1 , 1 ) K ( 1 , 0 ) K ( 0 , 2 ) K ( 0 , 1 ) K ( 0 , 0 ) ] ) S(i,j)=(\left[ \begin{matrix} I(i-2,j-2) & I(i-2,j-1) & I(i-2,j)\\ I(i-1,j-2) & I(i-1,j-1) & I(i-1,j) \\ I(i,j-2) & I(i,j-1) & I(i,j)\end{matrix} \right]*\left[ \begin{matrix} K(2,2) & K(2,1) & K(2,0)\\ K(1,2) & K(1,1) & K(1,0) \\ K(0,2) & K(0,1) & K(0,0)\end{matrix} \right]) S(i,j)=(⎣⎡I(i−2,j−2)I(i−1,j−2)I(i,j−2)I(i−2,j−1)I(i−1,j−1)I(i,j−1)I(i−2,j)I(i−1,j)I(i,j)⎦⎤∗⎣⎡K(2,2)K(1,2)K(0,2)K(2,1)K(1,1)K(0,1)K(2,0)K(1,0)K(0,0)⎦⎤) 卷积实际上就是互相关,其实更直接一点就是输入数据与卷积核对应“坐标”的每一格数据相乘的累加。
累加完毕之后,卷积核会根据我们设定的步长等因素平移,然后继续相乘累加。就犹如下图一样:
:卷积核移动的步长,决定着卷积核计算完一个单位以后,移动的“距离“
:Full、Same、Valid
- Full:当卷积核与图片像素开始相交时做卷积
- Same:当卷积核中心(K)与图片像素相交时开始做卷积
- Valid:当卷积核完全与与图片像素相交时开始做卷积
:如果我们有一个 𝑛×𝑛 的图像,使用𝑓×𝑓 的卷积核进行卷积操作,在进行卷积操作之前我们在图像周围填充 𝑝 层数据,输出的维度:
:卷积神经网络每一层输出的特征图(featuremap)上的像素点在输入图片上映射的区域大小,即特征图上的一个点对应输入图上的区域。
要计算感受野大小,可以采用从后往前逐层计算法:
- 第i层感受野到校和第i-1层的和相关,同时也与第i-1层感受野相关
- 假设最后一层(卷积层或池化层)输出特征图感受野的大小(相对于其直接输入而言)等于卷积核的大小
:一个卷积层通常包含多个尺寸一致的卷积核
激活函数
激活函数是用来加入非线性因素,提高网络表达能力,卷积神经网络中最常用的是ReLU,Sigmoid使用较少。这点在前馈神经网络章节中也有相关提及。
ReLU函数
- 计算速度快,ReLU函数只有线性关系,比Sigmoid和Tanh要快很多
- 输入为正数的时候,不存在梯度消失问题
- 强制性把负值置为0,可能丢掉一些特征
- 当输入为负数时,权重无法更新,导致“神经元死亡”(学习率不 要太大)
Parametric ReLU
$$ f(x)=\left{ \begin{aligned} \alpha x,x<0 \ x,x>0
\end{aligned} \right. $$
- 当 𝛼=0.01 时,称作Leaky ReLU
- 当 𝛼 从高斯分布中随机产生时,称为Randomized ReLU(RReLU)
- 比sigmoid/tanh收敛快
- 解决了ReLU的“神经元死亡”问题
- 需要再学习一个参数,工作量变大
ELU函数
$$ f(x)=\left{ \begin{aligned} \alpha (e^x-1),x<0 \ x,x\geq0
\end{aligned} \right. $$
- 处理含有噪声的数据有优势
- 更容易收敛
- 计算量较大,收敛速度较慢
总结
- CNN在卷积层尽量不要使用Sigmoid和Tanh,将导致梯度消失。
- 首先选用ReLU,使用较小的学习率,以免造成神经元死亡的情况。
- 如果ReLU失效,考虑使用Leaky ReLU、PReLU、ELU或者Maxout,此时一般情况都可以解决
- 浅层卷积层:提取的是图像基本特征,如边缘、方向和纹理等特征
- 深层卷积层:提取的是图像高阶特征,出现了高层语义模式,如“车轮”、“人脸”等特征
池化层
所谓的池化就是使用某个位置相邻输出的总体统计特征作为该位置 的输出。通俗的讲就是将矩阵中某几个格的数据压缩成1个格。
通常池化会使用最大池化与均值池化。而池化层是不需要训练学习参数读,它只需要指定池化类型、核大小、步幅即可。
假设现有一个3x3的矩阵,核大小为2x2,步幅为1。
- 减少网络中的参数计算量,从而遏制过拟合
- 增强网络对输入图像中的小变形、扭曲、平移的鲁棒性(输入里的微 小扭曲不会改变池化输出——因为我们在局部邻域已经取了最大值/ 平均值)
- 帮助我们获得不因尺寸而改变的等效图片表征。这非常有用,因为这样我们就可以探测到图片里的物体,不管它在哪个位置
全连接层
- 对卷积层和池化层输出的特征图(二维)进行降维
- 将学到的特征表示映射到样本标记空间的作用
输出层
输出层其实就是全连接成后的一个函数处理。
对于分类问题,输出层有: y i = e z i ∑ i = 1 n e z i y_i=\frac{e^{z_i}}{\sum^{n}_{i=1}e^{z_i}} yi=∑i=1nezie 标签: fci连接器10075025