基于卷积神经网络的mnist手写体识别

基于卷积神经网络的mnist手写体识别

1、卷积神经网络

1.1、什么是卷积神经网络

首先,卷积神经网络的概念,百度是这么给出解释的——卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)。

太长了。简单的理解一下,卷积神经网络(CNN)其实就是一种人工神经网络。它很擅长于处理图像特别是大图像的相关机器学习问题。

1.2、卷积神经网络的原理

我们所熟知的神经网络的构成如图:
在这里插入图片描述
其实卷积神经网络依然是层级网络,但是其中的层的功能做了一些变化,即传统神经网络的优化。

一个卷积神经网络由很多层组成,它们的输入是三维的,输出也是三维的,有的层有参数,有的层不需要参数。

其中除了输入层和输出层。卷积神经网络的隐含层通常包括以下几种层:
1、卷积层
2、池化层
3、全连接层
在一些更为现代的算法中可能有Inception模块、残差块(residual block)等复杂构筑。

卷积层:
1、卷积核

积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量(bias vector),类似于一个前馈神经网络的神经元(neuron)。卷积层内每个神经元都与前一层中位置接近的区域的多个神经元相连,区域的大小取决于卷积核的大小。卷积核在工作时,会有规律地扫过输入特征,在感受野内对输入特征做矩阵元素乘法求和并叠加偏差量:
在这里插入图片描述式中的求和部分等价于求解一次交叉相关(cross-correlation)。b为偏差量,
Zl和Zl+1表示第l+1层的卷积。
也被称为特征图(feature map),
Ll+1为Zl+1的尺寸,这里假设特征图长宽相同。
Z(i,j)对应特征图的像素,K为特征图的通道数,
f、s0和p是卷积层参数,对应卷积核大小、卷积步长(stride)和填充层数(padding)层数 。
在这里插入图片描述
2、卷积层参数
卷积层参数包括卷积核大小、步长和填充,三者共同决定了卷积层输出特征图的尺寸,是卷积神经网络的超参数。其中卷积核大小可以指定为小于输入图像尺寸的任意值,卷积核越大,可提取的输入特征越复杂。
卷积步长定义了卷积核相邻两次扫过特征图时位置的距离,卷积步长为1时,卷积核会逐个扫过特征图的元素,步长为n时会在下一次扫描跳过n-1个像素。

3、激励函数
卷积层中包含激励函数以协助表达复杂特征,其表示形式如下:
在这里插入图片描述

池化层:
在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域与卷积核扫描特征图步骤相同,由池化大小、步长和填充控制。

全连接层:
全连接层的作用就是把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
卷积神经网络中的全连接层等价于传统前馈神经网络中的隐含层。全连接层通常搭建在卷积神经网络隐含层的最后部分,并只向其它全连接层传递信号。特征图在全连接层中会失去3维结构,被展开为向量并通过激励函数传递至下一层。
【原理部分参考百度百科】

2、手写体识别

利用卷积神经网络进行mnist手写体识别。
以下是两种训练代码。
注意:下面的两个代码是要用到TensorFlow的,至于是安装GPU版本的还是CPU版本的,看个人喜好。
但是我使用的是CPU版本的,因为安装方便,但是运行速度不如GPU快。

2.1、两份代码

1、trainMnistFromImages.py

#coding:utf8
import os
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

sess = tf.InteractiveSession()


def getTrain():
    train=[[],[]] # 指定训练集的格式,一维为输入数据,一维为其标签
    # 读取所有训练图像,作为训练集
    train_root="Mnist手写体训练\mnist_train" 
    labels = os.listdir(train_root)
    for label in labels:
        imgpaths = os.listdir(os.path.join(train_root,label))
        for imgname in imgpaths:
            img = cv2.imread(os.path.join(train_root,label,imgname),0)
            array = np.array(img).flatten() # 将二维图像平铺为一维图像
            array=MaxMinNorm
  • 8
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值