卷积神经网络
1、卷积神经网络是什么?
(1)、卷积运算
假设一个6 * 6的图片像素矩阵A与一个3 * 3的矩阵B进行卷积运算,则生成一个4 * 4的矩阵C.
[
3
0
1
2
7
4
1
5
8
9
3
1
2
7
2
5
1
3
0
1
3
1
7
8
4
2
1
6
2
8
2
4
5
2
3
9
]
∗
(
卷
积
运
算
)
[
1
0
−
1
1
0
−
1
1
0
−
1
]
=
[
−
5
−
4
0
8
−
10
−
2
2
3
0
−
2
−
4
−
7
−
3
−
2
−
3
−
16
]
\left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 3 & 0 & 1 & 2 & 7 & 4\\ %第一行元素 1 & 5 & 8 & 9 & 3 & 1\\ %第二行元素 2 & 7 & 2 & 5 & 1 & 3\\ 0 & 1 & 3 & 1 & 7 & 8\\ 4 & 2 & 1 & 6 & 2 & 8\\ 2 & 4 & 5 & 2 & 3 & 9\\ \end{array} \right] %右括号 *(卷积运算) \left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\\ \end{array} \right] =\\ \left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 -5 & -4 & 0 & 8\\ -10 & -2 & 2 & 3\\ 0 & -2 & -4 & -7\\ -3 & -2 & -3 & -16\\ \end{array} \right]
⎣⎢⎢⎢⎢⎢⎢⎡312042057124182315295162731723413889⎦⎥⎥⎥⎥⎥⎥⎤∗(卷积运算)⎣⎡111000−1−1−1⎦⎤=⎣⎢⎢⎡−5−100−3−4−2−2−202−4−383−7−16⎦⎥⎥⎤
C11 对应运算为3 * 1 + 1 * 1 + 2 * 1 + 0 * 0 + 5 * 0 + 7 * 0 + 1 * -1 + 8 * -1 + 2 * -1 = -5
依次类推,C12对应
B矩阵通常被称为过滤器(filter),B矩阵有很明显的规律,经过运算可以检测出垂直边缘的变化,所以这种被称为垂直边缘检测。
不仅如此,还可以检测明暗变化的边缘
将B矩阵转置,则会检测水平方向的边缘检测。
依据这个过滤器,我们可以提取出图片的简单特征(垂直或水平的明暗变化)
(2)、Padding与Stride
但是,卷积运算会产生问题:
1、n * n 的矩阵与f * f的矩阵进行卷积运算,会产生一个(n - f + 1) * (n - f + 1)的矩阵,会造成图片矩阵缩小。
2、对于边缘的元素,只进行了一次运算,如A11元素。
所以,针对这两个问题,也需要相对的解决方法
①Padding:
所谓Padding,就是在原始图片中进行填充,如 6 * 6的矩阵进行边缘填充,可变为8 * 8的矩阵。
[
3
0
1
2
7
4
1
5
8
9
3
1
2
7
2
5
1
3
0
1
3
1
7
8
4
2
1
6
2
8
2
4
5
2
3
9
]
−
−
>
[
0
0
0
0
0
0
0
0
0
3
0
1
2
7
4
0
0
1
5
8
9
3
1
0
0
2
7
2
5
1
3
0
0
0
1
3
1
7
8
0
0
4
2
1
6
2
8
0
0
2
4
5
2
3
9
0
0
0
0
0
0
0
0
0
]
%开始数学环境 \left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 3 & 0 & 1 & 2 & 7 & 4\\ %第一行元素 1 & 5 & 8 & 9 & 3 & 1\\ %第二行元素 2 & 7 & 2 & 5 & 1 & 3\\ 0 & 1 & 3 & 1 & 7 & 8\\ 4 & 2 & 1 & 6 & 2 & 8\\ 2 & 4 & 5 & 2 & 3 & 9\\ \end{array} \right] %右括号 --> \left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 3 & 0 & 1 & 2 & 7 & 4 & 0\\ 0 & 1 & 5 & 8 & 9 & 3 & 1 & 0\\ 0 & 2 & 7 & 2 & 5 & 1 & 3 & 0\\ 0 & 0 & 1 & 3 & 1 & 7 & 8 & 0\\ 0 & 4 & 2 & 1 & 6 & 2 & 8 & 0\\ 0 & 2 & 4 & 5 & 2 & 3 & 9 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ \end{array} \right] %右括号
⎣⎢⎢⎢⎢⎢⎢⎡312042057124182315295162731723413889⎦⎥⎥⎥⎥⎥⎥⎤−−>⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0000000003120420005712400182315002951620073172300413889000000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
输出图像还是原来的6 * 6矩阵。
在运算中,Valid convolutions是不进行填充的卷积
而same convolutions是进行填充的卷积运算,要求输入的矩阵与输出的矩阵大小要相同。在这种情况下,填充大小为(f - 1)/2,所以f通常是奇数。
加入padding后再进行卷积运算
②卷积步长
每次卷积运算移动的步长,在前面进行卷积运算时,移动的步长记为S,S = 1,S =2时,则会产生下面的变化:
1、
2、
这样会得到3 * 3的矩阵。
所以padding =p,stride = s,进行卷积运算时会产生矩阵:
n * n矩阵与 f * f矩阵会产生一个[(n + 2p -f)/s + 1] * [(n + 2p -f)/s + 1]的矩阵。
2、三维卷积
以上我们进行的是二维卷积运算,处理的是灰度,而对于RGB三通道的图像需要多维的卷积运算,如 6 * 6的RGB三通道的矩阵,则表示为6 * 6 * 3,而相应的过滤器也应该变为 3 * 3 * 3矩阵,最终的矩阵也变为4 * 4矩阵。
如果只关注红色通道的特征,则可以把特征值设置为:
R
[
1
0
−
1
1
0
−
1
1
0
−
1
]
G
[
0
0
0
0
0
0
0
0
0
]
B
[
0
0
0
0
0
0
0
0
0
]
R \left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1 \end{array} \right] %右括号\\ \\ G \left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 0 & 0 & 0\\ 0 & 0 & 0\\ 0 & 0 & 0 \end{array} \right] %右括 \\ B \left[ %左括号 \begin{array}{ccc} %该矩阵一共3列,每一列都居中放置 0 & 0 & 0\\ 0 & 0 & 0\\ 0 & 0 & 0 \end{array} \right] %右括号
R⎣⎡111000−1−1−1⎦⎤G⎣⎡000000000⎦⎤B⎣⎡000000000⎦⎤
如此,我们实现了如何进行三维的卷积运算,需要注意的是,如果定义3个不同的过滤器,则会产生的矩阵也变为4 * 4 * 3的三维矩阵。
3、卷积神经网络
类比之前的神经网络模型,过滤器矩阵F就相当于之前的权重矩阵W
之
前
的
矩
阵
,
g
(
x
)
表
示
非
线
性
激
活
函
数
,
b
表
示
b
i
a
s
o
u
t
p
u
t
=
g
(
i
n
p
u
t
∗
w
+
b
)
而
在
卷
积
神
经
网
络
中
,
用
⊙
表
示
卷
积
运
算
o
u
t
p
u
t
=
g
(
i
n
p
u
t
⊙
F
+
b
)
之前的矩阵,g(x)表示非线性激活函数,b表示bias\\ output = g(input * w + b)\\ 而在卷积神经网络中,用⊙表示卷积运算\\ output = g(input ⊙ F + b)
之前的矩阵,g(x)表示非线性激活函数,b表示biasoutput=g(input∗w+b)而在卷积神经网络中,用⊙表示卷积运算output=g(input⊙F+b)
所以,卷积神经网络的一大特征就出来了,如果输入的图片像素矩阵是1000 * 1000或是 2000 * 2000,,传统的神经网络需要根据特征值的多少来设计权重矩阵,1000 * 1000的矩阵最少也要包含个1000 * 1000的权重参数, 但是对于过滤器参数矩阵F来说,大小的变化可以不根据输入矩阵大小变化(Padding和Stride保证了输入与输出的矩阵大小相同),每层神经网络都能用3 * 3 *3的过滤器提取特征,这样就可以避免因为参数过多而导致的过拟合问题。
卷积神经网络的结构
通常情况下,卷积神经网络分为三层,卷积层、池化层、全连接层
卷积层
卷积层的作用是提取图像的特征,经过不同维度的过滤器一层层的卷积运算,最终得到符合的特征矩阵。
池化层
其主要作用是减少冗余的无关特征值,即使经过卷积运算的图像,也是包含很多冗余特征值,所以,需要将图片精简且不改变特性,常用的操作有最大和平均池化。
Max Pooling
将矩阵中卷积核所映射的区域中最大的值取出,生成新的矩阵。
在此图中,卷积核的大小为2 * 2,步长为2,生成的是 2 * 2的矩阵。当然这些都可以变化,如图。
Average Pooling
此时选取的是过滤器覆盖区域的平均值,如图所示。
注意:池化层是确定的,不需要进行训练
全连接层
经过卷积运算和池化,此时的特征值的数量级已经可以被我们接受了,那么需要再添加全连接层,此层类似于我们之前学到的单层神经网络,主要是对高度抽象化的特征值进行整合,归一化,在输出概率值。
至此,卷积神经网络的大致模型就出来了,通常会采用
卷积–>池化–>卷积–>池化–>全连接
当然,这不是绝对的,可以根据实际情况调整为多层卷积后再池化或者引入多层全连接层。