基于CNN卷积神经网络的minst数据库手写字识别
up目录
一、理论基础
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)” 。
对卷积神经网络的研究始于二十世纪80至90年代,时间延迟网络和LeNet-5是最早出现的卷积神经网络;在二十一世纪后,随着深度学习理论的提出和数值计算设备的改进,卷积神经网络得到了快速发展,并被应用于计算机视觉、自然语言处理等领域 。
卷积神经网络仿造生物的视知觉(visual perception)机制构建,可以进行监督学习和非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化(grid-like topology)特征,例如像素和音频进行学习、有稳定的效果且对数据没有额外的特征工程(feature engineering)要求 。
定义:采用监督方式训练的一种面向两维形状不变性识别的特定多层感知机 。
CNN是在目标识别领域应用及其广泛的一种网络模型,其通过卷积运算来实现对图像特征的提取,避免了传统人工神经网络需要单独设计特征提取的环节。CNN的结构主要包括conv卷积层、pool池化层,Activation激活层以及FC全连接层,其具体如下图所示:
数字图像处理中我们用卷积模板和原始图像的像素卷积。过程如下:
Step 1、先将模板旋转180度(又称折叠)
Step 2、然后让模板依次和原始图像重叠,并且计算重叠部分的数值乘积之和,以2D为例
先对模板K做折叠,然后依次覆盖图像I,并且计算重叠部分的数值乘积之和
BP网络每一层节点是一个线性的一维排列状态,层与层的网络节点之间是全连接的。这样设想一下,如果BP网络中层与层之间的节点连接不再是全连接,而是局部连接的。这样,就是一种最简单的一维卷积网络。如果我们把上述这个思路扩展到二维,这就是我们在大多数参考资料上看到的卷积神经网络。具体参看下图:
图1:全连接的2D 网络(BP网络) 图2:局部连接的2D网络(卷积网络)
现在我们考虑单隐层结构,
上图左:全连接网络。如果我们有1000x1000像素的图像,有1百万个隐层神经元,每个隐层神经元都连接图像的每一个像素点,就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。
上图右:局部连接网络,每一个节点与上层节点同位置附近10x10的窗口相连接,则1百万个隐层神经元就只有100w乘以100,即10^8个参数。其权值连接个数比原来减少了四个数量级。
因此,卷积网络降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。
MNIST是一个手写体数字的图片数据集,该数据集来由美国国家标准与技术研究所(National Institute of Standards and Technology (NIST))发起整理,一共统计了来自250个不同的人手写数字图片,其中50%是高中生,50%来自人口普查局的工作人员。该数据集的收集目的是希望通过算法,实现对手写数字的识别。
二、核心程序
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
% function test_example_CNN
load mnist_uint8;
%该模型采用的数据为mnist_uint8.mat,?
%含有70000个手写数字样本其中60000作为训练样本,10000作为测试样本。?把数据转成相应的格式,并归一化。
train_x = double(reshape(train_x',28,28,60000))/255;
test_x = double(reshape(test_x',28,28,10000))/255;
train_y = double(train_y');
test_y = double(test_y');
%% ex1 Train a 6c-2s-12c-2s Convolutional neural network
%will run 1 epoch in about 200 second and get around 11% error.
%With 100 epochs you'll get around 1.2% error
%设置网络结构及训练参数
rand('state',0)
cnn.layers = {
struct('type', 'i') %input layer
struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer
struct('type', 's', 'scale', 2) %sub sampling layer
struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer
struct('type', 's', 'scale', 2) %subsampling layer
};
%训练选项,alpha学习率(不用),batchsize批训练中样本的数量,numepochs迭代次数。
opts.alpha = 1;
opts.batchsize = 50;
opts.numepochs = 5;
%初始化网络,对数据进行批训练,验证模型准确率
cnn = cnnsetup(cnn, train_x, train_y);
cnn = cnntrain(cnn, train_x, train_y, opts);
[er, bad] = cnntest(cnn, test_x, test_y)
%plot mean squared error
figure; plot(cnn.rL);
assert(er<0.12, 'Too big error');
up109
三、测试结果