卷积神经网络(CNN)

卷积

我们的图片是由像素的值组成的,而像素是通过数值存储到计算机中的,就像这样

image

图片的宽度和高度,是指图片在水平方向上像素的大小,和垂直方向像素的大小.每个像素有一个色值在0~255之间.
现在来做一件事,这里有一个3*3的格子,每个格子中都有一个数,我们叫它filter
image

在图片中画出与filter同样大小的格子称为slice,然后将slice与filter中对应位置的数值相乘,然后把乘积相加,最后会得到一个数值.
image

然后把filter向右移动一定的距离,这个距离称为步长,重复之前的操作.
image

直到将整张图片乘完,将得到的数值组合起来回得到一幅新的图片.
image

这个操作就是卷积.

卷积核的不同,卷积的结果也不同,通过调整卷积核我们可以得到图片不同方向的特征,比如下面两幅图就是使用不同卷积核后的结果:

image

以上我们是在1维的图片进行的卷积,但是图片通常都是由3个维度(R,G,B),所以卷积的时候也需要使用相同数量的filter.卷积时同样将slice与filter中对应位置的数值相乘,然后把乘积相加.需要注意的是,无论多少维度,卷积之后都是一维的.

image

不过我们会同时应用多个filter进行卷积,这样的话可以同时提取多种信息.

image

边缘填充

不知道你有没有发现,经过卷积后的图片会小一圈.为了让卷积后图片的尺寸不变,我们会采用边缘填充。

边缘填充还可以解决另外一个问题,仔细观察卷积过程,边缘的像素比中心的像素利用次数少,这就会导致丢失边缘信息。边缘填充后这个问题会得到改善。

image

边缘填充的原理很简单,就是在原始图片的四周加0填充,这样可以使得卷积前后尺寸不变。

卷积后图片的大小

知道卷积的原理后,其实可以很容易推导原图片,步长,filter尺寸,及卷积后图片尺寸的关系。

假设原始图片为 n_{H_{prev}} \times n_{H_{prev}} 的图片,边缘填充为 pad ,filter尺寸为 f*f ,则输出图片的尺寸为

n_H = \lfloor \frac{n_{H_{prev}} - f + 2 \times pad}{stride} \rfloor +1
n_W = \lfloor \frac{n_{W_{prev}} - f + 2 \times pad}{stride} \rfloor +1
n_C = \text{number of filters used in the convolution}

其中 \lfloor xxx \rfloor 表示向下取整。

为什么使用卷积

经常有这样的需求,判断一张图片中是否有某物体,比如说下图,我们要区分一张图片中是否有一个人,但是这个人有可能出现在图片的上方,也有可能出现在图片的下方,也有可能是任何位置.

image

卷积网络有两点好处:

  1. 卷积网络中的filters也就是参数W相当于在图片的任何位置都训练过,所以卷积网络可以分别出来图片中任何位置的特征,这个性质叫平移不变性.
  2. 由于图片的各个地方公用了参数fiters,所以使网络中的参数变少了,训练速度加快.

池化

在图片处理中经常简单一种与卷积很类似的结果-池化。

图片通常有区域化特征,同一区域颜色相同或相近,比如一张图片的某个像素是黑色的,这个像素周边的点大概率也是黑色的,如果这个像素是红色的,那么这个像素周边的点大概率也是红色的,那么为什么不能用一个像素来代表这块区域呢?这样既减少了计算量加快计算速度,又能高效的提取图片特征,更能防止过拟合.所以就有了池化.

image

池化的原理就是将一个区域的值用一个值来表示,下图为一个最大池化的过程,用红色区域里面的最大值代表这个区域.
image

最常见的池化操作为平均池化mean pooling和最大池化max pooling,最大池化是取区域中的最大值,平均池化是取区域中的平均值.
image

posted @ 2018-11-13 16:23:27
评论加载中...
发表评论