1.卷积神经网络(CNN)

是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 [1-2] 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”。卷积神经网络仿造生物的视知觉(visual perception)机制构建,可以进行监督学习和非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化(grid-like topology)特征,例如像素和音频进行学习、有稳定的效果且对数据没有额外的特征工程(feature engineering)要求。

目标

在前面我们读取了数据,现在要利用卷积神经网络模型来对字符进行识别。这也是最经典的机器学习的算法。

对CNN的了解和介绍

CNN有三个基本思想
1.局部感受野(local receptive fields)
2.权值共享(shared weights)
3. 池化(pooling)

局部感受野(local receptive fields)

刚刚我们在DNN中是把输入层784个神经元排成了一条长线,这里我们还原图片原来的样子(2828),如下图
Datawhale 零基础入门CV赛事-Task3 字符识别模型
DNN中,我们会把输入层的每个神经元都与第一个隐藏层的每个神经元连接(看看盗图1)。而在CNN中我们这样做的,第一个隐藏层的神经元只与局部区域输入层的神经元相连。下图就是第一个隐藏层的某个神经元与局部区域输入层的神经元相连的情况。
Datawhale 零基础入门CV赛事-Task3 字符识别模型
这里的局部区域就是局部感受野,它像一个架在输入层上的窗口。你可以认为某一个隐藏层的神经元学习分析了它”视野范围“(局部感受野)里的特征。图中一个隐藏层的神经元有5
5个权值参数与之对应。

我们移动这样一个窗口使它能够扫描整张图,每次移动它都会有一个不同的节点与之对应。我们从输入层左上角开始,如下
Datawhale 零基础入门CV赛事-Task3 字符识别模型
以此类推可以形成第一个隐藏层,注意我们的图片是2828的,窗口是55的,可以得到一个24*24(24=28-5+1)个神经元的隐藏层

这里我们的窗口指滑动了一个像素,通常说成一步(stride),也可以滑动多步,这里的stride也是一个超参,训练是可以根据效果调整,同样,窗口大小也是一个超参。

权值共享(Shared weights and biases)

上一节中提到一个隐藏层的神经元有55个权值参数与之对应。这里要补充下,这2424个隐藏层的神经元它们的权值和偏移值是共享的 用公式描述下

σ(b+∑l=04∑m=04wl,maj+l,k+m)
σ代表的是**函数,如sigmoid函数等,b就是偏移值,w就是55个共享权值矩阵,我们用矩阵a表示输入层的神经元,ax,y表示第x+1行第y+1列那个神经元(注意,这里的下标默认都是从0开始计的,a0,0表示第一行第一列那个神经元)所以通过矩阵w线性mapping后再加上偏移值就得到公式中括号里的式子,表示的是隐藏层中第j+1行k+1列那个神经元的输入。有点晕的话就参照上面的图,图4就是j=k=0的情况,图5是j=0,k=1. 最后加上**函数就表示该隐藏神经元的输出了。这部分原理和DNN是一样的,如果把w改成2828的矩阵就变成了全连接,就是DNN了。

我们能不能简化一下这个公式呢
a1=σ(b+w∗a0)
a1表示隐藏层的输出,a0表示隐藏层的输入,而∗就表示卷积操作(convolution operation) 这也正是卷积神经网络名字的由来。

由于权值共享,窗口移来移去还是同一个窗口,也就意味着第一个隐藏层所有的神经元从输入层探测(detect)到的是同一种特征(feature),只是从输入层的不同位置探测到(图片的中间,左上角,右下角等等),必须强调下,一个窗口只能学到一种特征!另外,窗口还有其他叫法:卷积核(kernal),过滤器(filter)。我们在做图像识别时光学习一个特征肯定是不够的,我们想要学习更多的特征,就需要更多的窗口。如果用三个窗口的话如下图
Datawhale 零基础入门CV赛事-Task3 字符识别模型
权值共享还有一个很大的好处,就是可以大大减少模型参数的个数。我们的例子中,一个窗口参数个数是26(55+1),20个窗口就是520个参数,如果换成全连接的话就是785(2828+1)个参数,比CNN多了265个参数。可能你觉得265嘛,对计算机来说完全不算什么。如果我们是30个隐藏层的DNN的话(深度学习里很常见的),需要23550(785*30)个参数,是CNN的45倍多。。当然我们也不能光光去比较它们参数的个数,毕竟两个模型本质原理上就相差甚远,但是直觉上我们可以感受到,CNN可以依靠更少的参数来获得和DNN相同的效果,更少的参数就意味着更快的训练速度.

池化(Pooling)

CNN还有一个重要思想就是池化,池化层通常接在卷积层后面。池化这个词听着就很有学问,其实引入它的目的就是为了简化卷积层的输出。通俗地理解,池化层也在卷积层上架了一个窗口,但这个窗口比卷积层的窗口简单许多,不需要w,b这些参数,它只是对窗口范围内的神经元做简单的操作,如求和,求最大值,把求得的值作为池化层神经元的输入值,如下图,这是一个2*2的窗口
Datawhale 零基础入门CV赛事-Task3 字符识别模型
值得注意的是,我们此时的窗口每次移动两步,采用的是求最大值的方法,所有称之为max-pooling,刚刚卷积层含有2424个神经元,经过池化后到池化层就是1212个神经元。通常卷积层的窗口是多个的,池化层的窗口也是多个的。简单来说,卷积层用一个窗口去对输入层做卷积操作,池化层也用一个窗口去对卷积层做池化操作。但是注意这两个操作的本质区别。下面来看一个用三个卷积窗口和跟随其后的池化窗口长啥样。
Datawhale 零基础入门CV赛事-Task3 字符识别模型
到此为之,CNN的基本原理大致介绍完毕了,如果只需对CNN做大致了解的话上面的内容我想应该足够了。下面主要介绍下其数学原理了,想看可以去原文章看。以上是查找资料所得
原文链接:添加链接描述

总结

1.Keras中有一个层是Flatten层,这个层可以把二维的图片转换成一维的数据,因此不需要单独做处理,而是在做完各种数据预处理后,用这个平层,把二维的数据处理成一维。
2.Keras模型中有对数据进行分类,首先不是一定需要把所有的图片都处理成正方形,长方形的图片一样可以进行各种处理,另外,压缩成小的图片是为了处理量小,快速方便,而不是因为一定要这么做,如果资源够的话,那么就用原图也可以。
3.神经网络层的输入必须是numpy数组,或者numpy数组组成的数组。只有这个格式的数据才可以输入模型训练,另外,输入的X的矩阵中,各个维度的长度必须是相同的,不能出现每一行的维度不同,不然会报错。
4.神经网络中的loss函数的选择不当,会导致在某些情况下报错,因此要注意Loss函数的选择。
5.Keras神经网络的两大卡点应该是:1. 各种参数的设置。 2. 输入数据的格式维度问题。
6.卷积神经网络和一般的分类器略有不同,卷积神经网络通过卷积核,能够自动提取特征,不需要人工提取特征,因此省去了大量的特征提取工程,但是因此,CNN需要的数据量要远高于神经网络、逻辑回归,SVM等数据分析。极端情况下,逻辑回归,神经网络,SVM等分类器只要模型足够简单,神经元个数较少,其实未必需要大量的样本,也就是说逻辑回归、神经网络和SVM的模型可以很简单。
7.图像处理适合用CNN的方法解决。
8.CNN的原理是通过卷积核来查找图像某方面的特征,然后将这些特征输入到模型里面去,和结果建立一种关系,因此是对特征的分类。
9.CNN只需要输入卷积核的个数和步长,模型就会自动生成卷积核,然后提取特征,不需要人为去设置卷积矩阵。

相关文章:

  • 2021-08-01
  • 2021-10-29
  • 2021-10-11
  • 2021-07-01
  • 2021-09-23
  • 2021-11-13
  • 2021-09-15
  • 2021-12-15
猜你喜欢
  • 2021-04-02
  • 2021-11-02
  • 2021-06-13
  • 2021-05-18
  • 2021-04-12
  • 2021-08-03
相关资源
相似解决方案