导语
机器学习中,当我们的数据是图片,或者说是矩阵时,要怎么样进行处理呢?其实,图片是我们表象所看到的,其本质也是一个或多个矩阵。如果我们把矩阵按照行或者列,拉成一个长向量,那就可以采用DNN的方法处理了,如下图所示:
如左上图所示,这是一张
1000
×
1000
1000\times1000
1000×1000 维的照片,而且是彩色照片,所以有R,P,G三个通道,那么这张照片的数据量是
3
6
3^6
36,如果我们的第一层隐藏层有100个单元,数据量将变成
3
8
3^8
38,这个量级,对于资源消耗是巨大的。
为了降低资源的消耗,我们需要降低数据的量级,怎么降低呢?从图片层面角度考虑,我们可以用几何方式对图像进行变换,提取某些对数据具有意义的特征。比如可以对图像进行模糊(blur),锐化(sharpen),提取垂直边界等。
以图像模糊化举例:
上图图像模糊化是怎么做到的呢?首先我们需要了解一下几个概念:
卷积核:即kernel,表示与图片矩阵计算的一个自定义矩阵;
卷积核大小: 即ksize,表示卷积核的大小,可以是1,2,3,4…
移动步长:即stride,表示卷积核在原图一次移动的步长,可以是1,2,3,4
补丁:即padding,表示在经卷积核输出的矩阵周围填充0
注:一般在ksize和stride固定情况下,输出矩阵的形状可以通过如下公式得出:
W
o
u
t
=
(
W
−
K
)
+
2
P
)
/
S
+
1
W_{out}=(W - K )+ 2P )/S + 1
Wout=(W−K)+2P)/S+1
上图中,首先我们定义一个卷积核,如图坐下,我们定义了一个
3
×
3
3\times3
3×3的矩阵。使其沿着图片矩阵滑动,分别求出每次移动后对应位置相乘后的和,输出一个新的矩阵。即表示做了依次图片的模糊化处理。
卷积层
从上面例子中,我们可以看到一个卷积核可以得到一次输出。如果一次使用多个卷积核,就会产生多个输出。在DNN中,一般我们会加多个隐藏层。每一层都有多个输出节点。假象我们是否可以将每个卷积核的结果作为一个隐藏层的节点,那么这一层隐藏层也可以被称为卷积隐藏层。我们可以通过下面例子深入理解:
上面这个图就是形成卷积层的过程。输入时一个
32
×
32
×
3
32\times32\times3
32×32×3的RGB通道矩阵,通过6个
5
×
5
5\times5
5×5 的卷积核得到
28
×
28
×
6
28\times28\times6
28×28×6 的输出。具体解读图片如下:
- 输入图片时RGB-3通道的,深度为3。所以卷积核的深度也为3,为了能让卷积核跟图片进行滑动,我们定义卷积核的深度也为3,大小为 5 × 5 5\times5 5×5。
- 通过上面卷积输出形式的公式,一个 32 × 32 × 3 32\times32\times 3 32×32×3的图片经过 5 × 5 × 3 5\times5\times3 5×5×3的卷积核计算,得到一个 28 × 28 28\times28 28×28的输出。
- 一共有6个卷积核,所以我们的最终输出是
6
×
28
×
28
6\times28\times28
6×28×28
如果我们把输出作为一层隐藏层,则输出如下图所示:
上图所以激活函数可以使用ReLu激活函数。
池化层
上面我们使用卷积层作为一层隐藏层,但是计算量还是比较大的。现在,有一种比卷积层速度更快的隐藏层构建方式----池化层。它是采用下采样的方式,快速的减少输入的大小,同时不丢失图片重要信息。池化层一般有两种表现方式:
- max pooling (最大池化层)
- average pooling (平均池化层)
接下来,我们使用max pooling 举例:
如上图所示,我们有一个 4 × 4 4\times4 4×4的图片矩阵,现在我们需要构建一个 2 × 2 2\times2 2×2的矩阵核,但是并没有数据,然后让矩阵核沿着图片矩阵滑动,每一次滑动,把每一次矩阵中的最大值作为输出。同理,average pooling 就是把每次矩阵中的平均值作为输出。
卷积神经网络
CNN,即Convolutional Neural Network的缩写,上面我们解读的卷积层核池化层的概念,那么CNN,就是一个卷积层+池化层+卷积层+池化层…一个不断循环往复的神经网络结构。
最经典的CNN结构,是由Yann LeCun提出的用于手写体数字识别的卷积神经网络结构。如下图所示:
上图神经网络结构被叫做LeNet-5,它由2个卷积层+1个池化层+3个全连接层构成。全连接层和卷积池化层有啥区别呢?卷积和池化层都是全部运算,全连接层是所有数据都参与运算。
关于卷积神经网络最基础的概念先介绍到这里
学习来源:深度学习与实践