CNN——卷积神经网络
- 卷积
- 滤波器(filter)
- 步长(Stride)
- 零填充(Zero Padding)
- 池化(pooling )
- 卷积神经网络
- 卷积层
- 有深度的数据的卷积
- 池化层
- 最大汇聚(Maximum Pooling)
- 平均汇聚(Mean Pooling)
- 全连接层
- CNN vs FNN
- 局部连接
- 权重共享
卷积
滤波器(filter)
首先定义一下滤波器的概念,大家可以看到图片可以看作是一个二维矩阵的数据,而滤波器也是一个二维矩阵,通过图片上的数据乘以滤波器里的参数得到的结果再组成新的图片数据可以含有新的特征,这里我们自己定义了滤波器里面的参数,得到的图片就是含有图形边界特征的图片数据。
我们可以通过设计特定的filter,让它去跟图片做卷积,就可以识别出图片中的某些特征。我们的CNN,主要就是通过一个个的filter,不断地提取特征,从局部的特征到总体的特征,从而进行图像识别等等功能。但是,那么多的filter难道都需要我们自己去设计?而我们又怎么知道哪些参数是好的呢?其实这些都不需要,我们通过CNN这样一种神经网络结构来自己学习到好的参数,这也就是CNN的原理。
步长(Stride)
滤波器的步长(Stride)是指滤波器在滑动时的时间间隔。步长通俗来讲就是我们的滤波器在数据上每次移动的距离。
零填充(Zero Padding)
零填充(Zero Padding)是在输入向量两端进行补零。我们通过这样一种方式在滤波器进行移动卷积的时候,我们可能需要在边缘补零来实现我们想要的输出结构。
池化(pooling )
这个pooling,是为了提取一定区域的主要特征,并减少参数数量,防止模型过拟合。
下面这个图就是最大最大汇聚(Maximum Pooling)的举例
卷积神经网络
CNN神经网络的整体结构可以由3个层来组成:
卷积层
由滤波器filters和激活函数构成。 一般要设置的超参数包括filters的数量、大小、步长,以及是否有补零。当然,还包括选择什么激活函数。
特征映射(Feature Map)为一幅图像(或其它特征映射)在经过卷积提取到的特征,每个特征映射可以作为一类抽取的图像特征。而我们每次卷积会得到多少Feature Map呢?有多少个卷积核,我们就会得到多少个Feature Map。
有深度的数据的卷积
这里要明白最开始的时候我们数据可能是二维的,但是也可能是三维的含有深度的或者经过一次卷积成为了三维的数据结构。所以,我们的卷积核的最后一维(也就是深度) 要跟输入的数据的最后一个维度一致。 这个时候的卷积,是所有深度的所有元素对应相乘后求和。 卷积之后就是接上对应非线性函数(例如Relu函数)。
池化层
这里的池化层里的具体操作就是上面提到的池化,最主要有两大类。需要指定的超参数,包括是Max还是average,窗口大小以及步长。其作用是进行特征选择,降低特征数量,并从而减少参数数量。
最大汇聚(Maximum Pooling)
一般是取一个区域内所有神经元的最大值。
平均汇聚(Mean Pooling)
一般是取区域内所有神经元的平均值。
全连接层
就是最简单的全连接神经,把我们的数据最后归一化为一个结果。这里需要说明的是,在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与全连接层连接,这之后就跟普通的神经网络无异了。
CNN vs FNN
那么CNN卷积神经网络相比于普通的全连接的前馈神经网络的优势是什么呢?
局部连接
相比于前馈神经网络的全连接,CNN实现了局部连接。这样,我们所需要的训练的参数就大大减少了,降低了模型的过拟合。同时,最后的输出的一部分可能只和之前的数据的局部相关联,而不是所有的数据都会影响,这样也提高了最后结果的准确性。
权重共享
可以看到,当我们在反复用卷积核取卷积数据时,我们的卷积核上的参数是重复使用的。共享参数帮我们更少地减少参数数量,同样也是合理的。举例说,判断一个图形的局部形状和这个形状在图形的哪个位置并不相关,所以相同参数就ok了。
OK,以上就是目前对于CNN的理解,还有很多地方未弄清楚。