Convolution Neural Network 卷积神经网络
用神经网络直接做图像处理。
将图片的像素排成一个很长的矢量。作为输入。输出就是属于什么类别。
每一个神经元就是一个分类,比如说第一层里代表黑色、红色和斜条纹。
第二层里代表各种花纹,之后下去每层越来越复杂。那么问题就是,直接用神经网络来做,参数太多,这样就需要CNN。
CNN的做法:简化神经网络的参数,去掉网络中的一些没用的参数。
用CNN识别图像有三种情况:
1.整张图片识别参数过多,通常识别某个图案是小于某个整个图像的,所以不需要看到整个图像来识别这个图案。
检测是不是鸟嘴只需要看红色框里的一部分就足够了。
2.同样的图案会出现在不同的区域,虽然出现在不同的区域,但是识别的神经元的参数是相同的
同样时识别鸟嘴,左上角出现鸟嘴和中间出现鸟嘴,做的是类似的工作,可以使用相同的参数。
3.subsamping(子抽样,缩小图像)不会改变识别的对象。我们可以通过subsamping使图像变小,这样参数就变得更少了。
缩小图像可以使图像的像素更小,参数更少,但是不影响图像的识别。
CNN的整个流程
首先对输入的像素进行卷积,池化(这个过程可以重复多次,重复次数时实现决定的),
然后对处理完的像素进行一维展开,作为全连接前馈神经网络的输入,之后输出的结果就是图像属于的类别。
Convolution 卷积
黑白图像,0是白色,1是黑色
首先选取一个6*6的图像,然后有一组给定的filter。Filter就相当于神经网络中的神经元。Filter中的0和1就相当于神经网络中的参数,是靠训练得到的。3.3的filter意味着filter侦测整张图像的3.3的一部分,而不是整个图像。
将filter移到左上角,做内积,然后依次向右,向下移动stride距离(步长,自己设定的)
这样一个6*6的图像就变成了一个4*4的图像。
这样做的目的:
可以看到filter1的左上到右下对角线上都是1,当filter与图像做内积时,可以在与filter同样形状的地方上得到最大值3,也就是在6*6的图像中筛选出与filter类似的形状。
同样filter2也是一样的道理,当filter2走完之后,就识别出中间列为111的图像位置。
有多少filter就有多少层,这些图像层加在一起,就叫做feature map 特征图。
对于彩色的图像,由于像素是由三个值决定的,所以filter也变成3维度
Filter同时就考虑了不同channel的图像,将filter中的9个值与图像中的9个值直接做内积。(并没有将不同的channel分开来算)
卷积与全连接神经网络之间的关系:
特征图的输出其实就是全连接神经网络的一层的输出
Filter的作用就是用神经元进行分类
Filter就相当于神经网络中的神经元。Filter中的0和1就相当于神经网络中的参数,是靠训练得到的。
将6*6的图像的前三排18个像素拿出来进行编号,1~18.
filter1在第一个位置上就是与编号123.789.131415进行连接,得到3.
filter1在第二个位置上就是与编号234.8910.141516进行连接,得到-1
这里编号的数值就相当于神经网络中的weight。在不同的位置上,也会有重复的编号出现,也就是共用同一个weight,这样就减少了参数。相当于全连接神经网络拿掉了一些参数。
Max pooling 池化
也就是将feature map进行分块,每块中选出最大值保留下来。
做完一次convolution和maxpooling之后,一个6*6的图像就变成了2*2的图像。像素的深度为两层,有多少深度取决于有多少filter。这样就的到了一个比之前图像小的图像,重复进行convolution和maxpooling还可以使图像变得更小。
Flatten
将convolution和maxpooling之后得到的图像像素进行拉直成一维,作为全连接前馈神经网络的输入值。
Cnn in keras
25.3.3.代表有25个3*3的filter,
1,28,28代表是黑白图像,像素为28*28、
2,2代表取feature map里面2*2的像素,在其中选出最大值进行保留。
输入一个28*28像素的图片,通过25个3*3的filter的卷积(filter只有一层,有3*3=9个参数),得到25层26*26的特征图,经过2*2的池化,得到25层13*13像素的特征图。
再经过50个3*3的filter的卷积(filter有25层,有3*3*25=225个参数)得到50层11*11的特征图,经过2*2的池化,得到最终50层5*5像素的特征图。
将50*5*5=1250的像素拉成矢量,作为全连接前馈神经网络的输入。