字符模型识别
学习目标
1.学习CNN基础和原理
2.使用Pytorch框架构建CNN,并完成训练
CNN介绍
卷积神经网络(CNN)是一类特殊的人工神经网络,是深度学习的重要分支。CNN在很多领域都表现优异,精度和速度比传统计算学习算法高很多。特别是在计算机视觉领域,CNN是解决图像分类、图像检索、物体检测和语义分割的主流模型。
CNN是一种层次模型,输入的是院士的像素数据。CNN通过卷积(convolution)、池化(pooling)、非线性**函数(non-linear activation function)和全连接层(fully connected layer)构成。下图所示为LeNet网络结构,是非常典型的字符识别模型。两个卷积层,两个池化层,两个全连接层组成。卷积核都是5*5,stride=1,池化层使用最大池化。
数据输入层
该层要做的处理主要是对原始图像数据进行预处理,其中包括:
去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化
卷积层
卷积层是学习特征,这层中进行及图像卷积操作,在操作过程中,要选择步幅(stride),卷积尺寸,还有填充(padding).步幅控制着过滤器围绕输入内容进行卷积计算的方式。过滤器通过每次移动一个单元的方式对输入内容进行卷积。过滤器移动的距离就是步幅。步幅的设置通常要确保输出内容是一个整数而非分数。让我们看一个例子。想象一个 7 x 7 的输入图像,一个 3 x 3 过滤器(简单起见不考虑第三个维度),步幅为 1。这是一种惯常的情况。
如果把步长增加到2
所以,正如你能想到的,感受野移动了两个单元,输出内容同样也会减小。注意,如果试图把我们的步幅设置成 3,那我们就会难以调节间距并确保感受野与输入图像匹配。正常情况下,程序员如果想让接受域重叠得更少并且想要更小的空间维度(spatial dimensions)时,他们会增加步幅。
池化层
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
池化层的作用有:
1.特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
2.特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
3.在一定程度上防止过拟合,更方便优化。
全连接层
两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的。
更加详细的操作原理了解可以参考卷积神经网络.
Pytorch构建CNN模型
该代码示例为简单的CNN模型,两个卷积层,最后并联6个全连接层进行分类。
接着是训练代码