卷积神经网络概论(Convolutional Neural Network,CNN)
卷积神经网络基础
与普通神经网络相比,卷积神经网络有一些特殊的层,也有一些卷积神经网络中特有的专有名词,本文将会逐一介绍。
全连接层(Fully Connected Layer)
全连接层可以理解为神经网络基础中的“隐藏层”。(同样的,包含权重向量 W W W和**(激励)函数)
对于全连接层的作用,举个例子:
-
有一张32 x 32 x 3的图片(宽和高为32px,有RGB三个通道,因此可以理解为32 x 32 x 3的矩阵)
-
先将其拉伸为3072 x 1的向量作为神经网络的输入,然后和权重向量 W W W做点乘,再通过**函数(Sigmoid 或 Tanh)
-
输出结果,这个就是全连接层的最终结果
特征层(Feature map) & 特征向量
- 特征向量:
-
特征层:
- 当**后的结果为二维向量时,我们称之为特征层(有时也叫**层,activation map)
卷积层(Convolution Layer)
和全连接层不同,卷积层保留了图像的空间特征。(即图片不需要Like全连接层,不做图片的“拉伸”)
为了了解卷积层的过程,先来了解相关名词:
卷积核(Kernel)
卷积核,常常简称为**“卷积”,有时也称为滤波器**(filter)
卷积的大小通常是自定义的长和宽(常常设置为1 x 1,3 x 3,5 x 5等),但是高应该与输入图片的通道数目一致
步长(Stride)
步长是指卷积在输入图片上移动时,需要移动的像素(px)数。
- s t r i d e = 1 stride=1 stride=1,每次移动1px,则计算过程不会跳过任何像素
- s t r i d e = 2 stride=2 stride=2,每次移动2px……
感受野
卷积每次滑动所覆盖的范围,在图像处理中叫“感受野”。
下面来了解具体的卷积过程:
-
一维卷积:
例子1
-
条件: S t r i d e = 1 , K e r n e l = 1 ∗ 3 , I n p u t = 1 ∗ 7 Stride=1,Kernel=1*3,Input=1*7 Stride=1,Kernel=1∗3,Input=1∗7
-
过程:
-
卷积计算:
A
=
∑
i
=
1
3
I
n
p
u
t
i
∗
K
e
r
n
e
l
i
=
5
∗
10
+
2
∗
5
+
6
∗
11
=
126
A=\sum_{i=1}^{3}{Input_i*Kernel_i}=5*10+2*5+6*11=126
A=∑i=13Inputi∗Kerneli=5∗10+2∗5+6∗11=126
B = . . . B=... B=...
以此类推
最终获得一个 1 ∗ 5 的 O u t p u t 1*5的Output 1∗5的Output
例子2
-
条件: S t r i d e = 2 , K e r n e l = 1 ∗ 3 , I n p u t = 1 ∗ 7 Stride=2,Kernel=1*3,Input=1*7 Stride=2,Kernel=1∗3,Input=1∗7
-
过程:
卷积计算同例子1
最终获得一个 1 ∗ 3 的 O u t p u t 1*3的Output 1∗3的Output
-
二维卷积
例子3(一个正常的例子)
-
条件: S t r i d e = 1 , K e r n e l = 3 ∗ 3 , I n p u t = 7 ∗ 7 Stride=1,Kernel=3*3,Input=7*7 Stride=1,Kernel=3∗3,Input=7∗7
-
过程:
-
卷积计算同例子1(自行举一反三)
最终会获得一个 5 ∗ 5 的 O u t p u t 5*5的Output 5∗5的Output
例子4(一个错误的例子)
-
条件: S t r i d e = 3 , K e r n e l = 3 ∗ 3 , I n p u t = 7 ∗ 7 Stride=3,Kernel=3*3,Input=7*7 Stride=3,Kernel=3∗3,Input=7∗7
-
过程:
由于行列性质一样,这里只观察列:
计算过程中,卷积覆盖到的列: ( 1 , 2 , 3 ) − ( 4 , 5 , 6 ) − ( 7 , ? , ? ) (1,2,3)-(4,5,6)-(7,?,?) (1,2,3)−(4,5,6)−(7,?,?)
此时很明显,第三次卷积计算的时候,有两列不存在(不存在8,9列)。
因此这个卷积是有错误的,在最后缺少输入——没法计算。
-
三维卷积(多了一个卷积堆叠)
例子5
-
条件: S t r i d e = 1 , K e r n e l = 5 ∗ 5 ∗ 3 , I n p u t = 32 ∗ 32 ∗ 3 Stride=1,Kernel=5*5*3,Input=32*32*3 Stride=1,Kernel=5∗5∗3,Input=32∗32∗3
-
过程:
-
还是做点乘,且每一次滑动都将带来
5
∗
5
∗
3
=
75
5*5*3=75
5∗5∗3=75的计算量。
最终生成了一个 28 ∗ 28 ∗ 1 28*28*1 28∗28∗1的 O u t p u t Output Output,即前面所讲的特征层(feature map)。
但是!!!一个卷积是远远不够的
我们再定义多个不同的卷积(分别完成不同的任务),进行卷积计算。
这里我们直接定义6个不同的卷积( K e r n e l / F i l t e r Kernel/Filter Kernel/Filter),进行卷积计算。
最终的特征层将是一个
28
∗
28
∗
6
28*28*6
28∗28∗6的新Output
卷积神经网络
所有应该学的基础知识你都学到了,那么现在,可以正式介绍卷积神经网络了。
卷积神经网络是由一系列卷积层经过**来得到的。
接下来要介绍一种更加通用的卷积形式:
-
先介绍一个常用方法——填充(Pad),如:在 7 ∗ 7 7*7 7∗7的 I n p u t Input Input周围做一个像素的填充,变成 8 ∗ 8 8*8 8∗8
-
这里给出通用卷积层的计算公式:
-
条件:
- 输入图像 I n p u t = W 1 ∗ H 1 ∗ D 1 Input=W_1*H_1*D_1 Input=W1∗H1∗D1(代表宽+高+通道[channel])
- $Kernel=F*F , 个 数 为 ,个数为 ,个数为K$
- P a d Pad Pad大小为 P P P
-
那么经过卷积后的第二层, O u t p u t Output Output的宽+高+通道[channel]为:
W 2 = W 1 − F + 2 P S + 1 W_2=\frac{W_1-F+2P}{S}+1 W2=SW1−F+2P+1
H 2 = H 1 − F + 2 P S + 1 H_2=\frac{H_1-F+2P}{S}+1 H2=SH1−F+2P+1
D 2 = K D_2=K D2=K
-
-
例子6
-
条件: S t r i d e = 1 , K e r n e l = 5 ∗ 5 ∗ 3 , K = 10 , P a d = 2 , I n p u t = 32 ∗ 32 ∗ 3 Stride=1,Kernel=5*5*3,K=10,Pad=2,Input=32*32*3 Stride=1,Kernel=5∗5∗3,K=10,Pad=2,Input=32∗32∗3
-
通过以上条件可以计算出,特征层(feature map)的大小为 32 ∗ 32 ∗ 10 32*32*10 32∗32∗10,同时每个Kernel的参数个数是 5 ∗ 5 ∗ 3 + 1 = 76 5*5*3+1=76 5∗5∗3+1=76( + 1 +1 +1表示 b i a s bias bias)。
-
因此这一层需要学习的参数个数为 76 ∗ 10 = 760 76*10=760 76∗10=760
-
通过一层层的卷积运算(包括点乘+**(激励)函数),就得到了一个卷积的神经网络。
池化层
池化( p o o l i n g pooling pooling)——是对图片进行压缩(也叫“降采样”)的一种方法。
池化的方法有很多,如:
- M a x p o o l i n g Max\space pooling Max pooling:选”感受野“中权值最大的作为池化层的参数。
- A v e r a g e p o o l i n g Average\space pooling Average pooling:计算”感受野“中的平均权值作为池化层的参数。
同样的,这里给出通用池化层的计算公式:
-
条件: S t r i d e = S Stride=S Stride=S,池化 K e r n e l = F ∗ F , I n p u t = W 1 ∗ H 1 ∗ D 1 Kernel=F*F,Input=W_1*H_1*D_1 Kernel=F∗F,Input=W1∗H1∗D1(代表宽+高+通道[channel])
-
那么经过池化操作之后, O u t p u t Output Output的宽+高+通道[channel]为:
W 2 = W 1 − F S + 1 W_2=\frac{W_1-F}{S}+1 W2=SW1−F+1
H 2 = H 1 − F S + 1 H_2=\frac{H_1-F}{S}+1 H2=SH1−F+1
D 2 = D 1 D_2=D_1 D2=D1
-
例子7
一个 4 ∗ 4 4*4 4∗4的特征层,经过池化 K e r n e l = 2 ∗ 2 , S t r i d e = 2 Kernel=2*2,Stride=2 Kernel=2∗2,Stride=2的 M a x p o o l i n g Max \space pooling Max pooling池化操作后,可以得到一个2*2的特征层。如图:
在绝大多数情况下,卷积层+池化层+**层,几乎是一个整体般共同出现
批规范化层(BatchNorm Layer)
批规范化层——是为了加速神经网络的收敛过程以及提高训练中的稳定性。
Batch——几张图片同时传入网络前向计算,误差为 batch 中所有图片的误差累计。
BatchNorm方法——对一个batch 中的数据根据公式作归一化:
x p r e d i c t ( k ) = x k − E [ k ] V a r ( x k ) x_{predict(k)}=\frac{x_k-E[k]}{\sqrt{Var(x_k)}} xpredict(k)=Var(xk) xk−E[k] (说实话,我tm也不是很懂)