文章目录

  • 为什么使用CNN
  • 彩色图片-CNN
  • Max Polling
  • Flatten



是全连接神经网络的简化版,一般用于图像识别

为什么使用CNN

  • 图像只需要识别一部分
  • 同样的参数出现在不同的区域
  • 对图像放缩
  • 以上情况都可以使用CNN,减少神经网络的参数。
  • CNN的大致过程如图所示。

    先了解一下Convolution的做法:
    假设一个矩阵(图像信息可以写成矩阵的形式),有两个Filter(过滤器,卷积核)也是矩阵,Filter是可以通过神经网络学到的(事先决定Filter的大小cnn算法C程序 cnn算法步骤_卷积,学习得到参数)。

    然后使用这个Filter和左边大的矩阵中的相同size的所有子矩阵取内积,从第一个子矩阵开始,然后stride(步长)选择子矩阵,stride表示向右移动的距离。
    矩阵内积:
    cnn算法C程序 cnn算法步骤_卷积_02
    所以一个大的矩阵经过Filter处理后会得到一个新的矩阵,图中的Filter中斜对角可以检测出图像中具有的同一特征(即图像中不同位置斜对角参数相同),因为他们产生的结果相同,我们还可以看到图中的Filter1的特征(除主对角线外都是负值),因此它和图像中矩阵的内积的结果只有这个子矩阵的斜对角的值比较大,内积才会得出比较大的值;因此近似大小的值就可以这样的子矩阵的对角线部分的特征相似。
    即:出现在不同位置的Feature可以用同一个Filter同一组参数找到。

cnn算法C程序 cnn算法步骤_神经网络_03


然后可以使用不同的Filter按照上面的过程,从图像中筛选出不同的特征,会得到新的Feature Map。原来的图像中每个位置有一个数值来描述,而得到的新的图中每一个位置有多个数值(取决于Filter的个数)来描述,且图像变小。

cnn算法C程序 cnn算法步骤_cnn算法C程序_04

彩色图片-CNN

由于彩色图片是用RGB三原色构成,每个图像有三个矩阵构成,所以一个Filter也设置为三个,即Filter是立体的。然后可以按照单原色的方法。

cnn算法C程序 cnn算法步骤_cnn算法C程序_05


CNN可以和前面学习的神经网络比较有相似之处,CNN中的Filter相当于权重,图像中对应的值可以想象成被拉直后作为输入神经元,如下图:

cnn算法C程序 cnn算法步骤_cnn算法C程序_06


CNN可以改成全连接网络的形式来看,假设这个图像是6*6大小,按照位置标号(可以想象成将这个矩阵拉直),CNN中它的输入就是1~36维,输入层36个神经元,与FIlter得到的内积结果3就是下一层的神经元,第一个子矩阵上的值(即对应位置的神经元)都和3相连,下一个内积结果也可以如此连接,Filter中对应位置的值作为权值(对应图中相同颜色的线),与前连接网络不同的是,它们对应的神经元只和对应的内积结果相连接,而不与其他神经元相连接。我们再观察-1代表的这个神经元会发现,由于使用相同的Filter,所以他们的权值相同(线相同表示权值相同),即权值共享,只是输入不同,所以这里参数就减少了很多。

cnn算法C程序 cnn算法步骤_cnn算法C程序_07


cnn算法C程序 cnn算法步骤_权值_08

Max Polling

通过不同的Filter得到的结果如下图:

Max pooling将矩阵中的值进行分组,,留下组内最大的值,

cnn算法C程序 cnn算法步骤_权值_09


即:

cnn算法C程序 cnn算法步骤_卷积_10


这样就会得到新的图像矩阵:

cnn算法C程序 cnn算法步骤_神经网络_11


经过反复的卷积和max pooling,得到一张足够小的图像,然后需要进行Fiatten。

Flatten

将上面得到的结果拉直,放入全连接前馈神经网络中训练就可以得到最终结果。

cnn算法C程序 cnn算法步骤_cnn算法C程序_12


CNN在keras上的大致步骤:

cnn算法C程序 cnn算法步骤_卷积_13


图中第二次卷积时每个Filter有255个参数是因为第一次卷积后图像有高度25(第一次卷积有25个Filter),即255=3325.

cnn算法C程序 cnn算法步骤_卷积_14