这里不再重复什么是CNN,参考了两篇博文,总结记录了在学习CNN过程中的几点疑惑。
CNN做的就是下面3件事:
1. 读取图片:
把由一个个像素点组成的图片转换为计算机能读懂的0~255数字组成矩阵图。
2. 提取特征:
这是最关键的一步:此过程是由几个卷积核组成的卷积过程。这里需要解释下,在卷积的过程中,会不止一个过滤器(也叫卷积核),因为每个过滤器的参数不同,提取的特征也不同(而大小和个数由人为指定)。但是有以下几点需要注意:
(1)提取的过程可以简单看成如下的动态图:
绿色矩形框是图片矩阵;橘色矩形框是过滤器;右边的粉色矩形框就是得到的特征图。
这里要注意的是:在“卷积”过程中,这种对应数值相乘、再相加的计算,仅仅是“线性”计算;而在现实世界中,很多很多的数据,都是“非线性”的。所以,在“卷积”处理的后面,我们常常引入一个“非线性”的计算,来使得数据更加接近真实世界。具体到图片计算,ReLU相当于将“特征图片”中,像素值小于0的部分,全部变为0,因为图片的像素值是不存在负值的。如下:
所以在“卷积”的后面,再加上一步“ReLU计算”,但是如果得到的特征图的数值绝大多数均为正数,所以,经由ReLU处理后的图片可能并没有太大的改变。
(2)在人的眼睛中看到的提取特征后的图像应该是:
图像变小(从矩形图的大小可以看出矩形由原来的5x5,变为了3x3),并且图像变得模糊(但主要特征都被提取出来了)。
(3)同时要注意的是不同的过滤器提取得到的特征图是不同的:
比如提取得到的图:轮廓图、锐化图、浮雕图等
(4)过滤器中的值是怎么确定的?
这里就是算法要学习的其中一部分,不需要人为设定。而需要设定的参数有:
① 过滤器的大小(用字母“F”表示),需要注意的是:过滤器的尺寸越大,得到的图像细节就越少,最终得到的特征图的尺寸也更小。
②过滤器滑动的步幅数(用字母“S”表示)
③过滤器的个数(用字母“K”表示)。如下:
从上面的例子我们能够看到,“卷积”输出的结果,是包含“宽、高、深”3个维度的,而这个“深度”,等于过滤器的个数,也就是得到几种特征图。上面我们采用了4种过滤器,所以这里的深度是4。
④设置是否补零(用字母“P”表示),来看看“补零”后的效果:
这样得到的特征图大小就和原图一样大了。
如何确定“补零”的圈数,才能保证图片大小一致?这里有一个关系式:
假设原始图片的大小为W,当我们设置了过滤器的大小(F)、滑动的步幅数(S)、以及补零的圈数(P)。实际上,得到的特征图片大小为:
(5)如果得到的特征图片的尺寸很大的话,你还可以进一步添加“池化”的操作。所谓“池化”,就是在保留图片主要信息的前提下,将图片的尺寸缩小。
但是池化的操作是在ReLU处理后加入的。
池化的操作与“卷积”类似,需要我们设置2个超参数:过滤器大小(F)和 滑动的步幅数(S) 。
整个的特征提取过程如下:输入图片 → 卷积 → ReLU → 池化(可选)
但大部分的时候,我们会进行多次卷积和池化。
关于池化层和卷积层的几点区别:
① “池化”层使用的过滤器,与“卷积”层使用的过滤器有所不同:
“池化”层的过滤器,其内部没有数值,因为“池化”层的过滤器,其功能只是将图片缩小,故其内部没有参数。
在“池化”层中,仅有1个过滤器;而在“卷积”层中,可以设置多个过滤器:
因为“卷积”层的过滤器,其功能是提取图片的特征,因而,我们使用不同的过滤器,可以提取不同的图片细节。而“池化”层的过滤器,仅仅是为了缩小图片的尺寸,因而,使用一种过滤器,就可以达到这一目标,无需设置多个。
② 经过“卷积”处理后,得到的图片张数(即“图片深度”),应该等于该卷积层的过滤器个数;而经过“池化”处理后,得到的图片张数(即“图片深度”),仍等于上一层的图片张数。
当要处理的图片是彩色图片时:
和黑白图像的区别是灰度图的深度仅为1,而彩色图的深度为3(彩色图片包含红R、绿G、蓝B,三种通道)。
所以,彩色图片在进行第一层“卷积”时,需要同时处理3张图片(即“红、绿、蓝”)。
前面我们在处理灰白图片时,因为输入的图片其深度为1,所以我们采用的是大小为3*3,但是,深度为1的过滤器。而在处理彩色图片时,我们的过滤器,其深度增加为3。如下:
所以如果我们设置过滤器的个数为2个,也就是说提取原图的两种不同特征。此时的两个过滤器的形式为:
也就是说每个过滤器的有三种不同的取值矩形框,分别过滤原图每个通道上的特征:
当过滤器在图片上滑动时,
过滤器的“红色”层,负责提取原始图片“红色”通道的特征;
过滤器的“绿色”层,负责提取原始图片“绿色”通道的特征;
过滤器的“蓝色”层,负责提取原始图片“蓝色”通道的特征。
之后,将“红、绿、蓝”3层提取出的特征值相加,得到的最终值,就是“卷积”层输出的图片像素。
例如:假设我们有一张宽、高、深为4*4*3的彩色图片。并且,我们在“卷积层”,设置了2个过滤器,如下图:
提取过程:
注意此时最后得到的特征图仍然是两张,既是和过滤器的个数是一样的。这里的彩色图只是增加了过滤器和计算的复杂度,而得到的特征图个数不会改变。
这里要注意的是:
① 经过“卷积”后,输出的特征图片,其深度等于使用的过滤器个数。
② 推广到更一般的情况,无论是灰度图片,还是彩色图片,当我们构建的模型中,有多个“卷积”层时,都要遵循“彩色案例”中的步骤,即“在做‘卷积’处理时,如果上一层图片是多层,那么,本层过滤器在遍历完多层图片后,需要将结果值相加“。
3. 图片分类:
经过上面一系列的处理,此时得到的图片,已经可以被视为一串串简单的数字(即像素值)。然后将这一个个的像素值,带入模型:
就可以得到分类了。
这里要注意的是:
(1)首先需要将特征提取后得到的图片像素值展开
(2)在模型的最后,我们需要让计算机努力找到x-y之间的关系。而寻找的办法,就需要依靠“全连接神经网络”。
这里需要注意:
① “全连接神经网络”可以帮助我们学习到参数θ。
② 模型得到的最终结果,表示“图片为某种类别的概率”。注意:这里的概率之和,永远为1。
总结:
在构建模型时,需要我们设置的超参数有:
(1)卷积层: 过滤器的大小(F)、滑动的步幅数(S),以及过滤器的个数(K)
(2)池化层:过滤器的大小(F)
在算法运行时,计算机会自己学习的参数有:
(1)卷积层: 过滤器中的具体数值。
(2)全连接层: 神经元的参数 θ
参考:
http://mp.weixin.qq.com/s/fdBpynmAdcnjUW9DF2DQRg
https://mp.weixin.qq.com/s?__biz=MzI1NjczMjEwNw==&mid=2247483921&idx=1&sn=90250512a4b8d369955672c7b720eca0&scene=21#wechat_redirect