CNN-mnist手写数字识别

Tensorflow+CNN下的mnist数据集手写数字识别

  1. 加载数据集

MNIST数据集包含55000个训练样本,10000个测试样本,还有5000个交叉验证数据样本。

输入:加载的每个手写数字图像是28 x 28像素大小的灰度图像。为了简化起见,将28x28的像素点展开为一维数据(shape=784)。

输出:每张测试图片的预测结果y为一个10维数组,数组中值的取值范围为[0,1],使用tf.argmax(y,1),取出数组中最大值的下标,再用独热表示以及模型输出转换成数字标签。

         2.定义算法公式,也就是前向计算的计算图

处理多分类任务,通常采用Softmax模型。y = Softmax(Wx + b),其中W为权值矩阵,b为偏置向量,x为输入特征矩阵。

使用Softmax函数是将各个类别的打分转换成合理的概率值。其中权值矩阵W是将784维的输入转换成一个10维的输出。

本实验中使用的的CNN模型,是将输入的784维的输入向量,还原为28x28的图片格式,再经过两次卷积层、一次全连接层处理后,得到的1024维的向量转换成10维,即对应10个类别,调用Softmax函数将其转换成10个类别的概率。

Weight_variable()和bias_ariable()为初始化权重和偏置的初始化函数,给权重制造一些随机的噪声来打破对称,而给偏置增加一些小的正值(0.1)来避免死亡节点

Cov2d()和max_pool_2x2()为定义卷积层与池化层,使用的为tensorflow自带的二维卷积函数与池化函数。

第一层的卷积层:

卷积:卷积特征提取采用5x5,输入为1维,输出为32维。

W_conv1 = weight_variable([5 ,5, 1 ,32]) # patch 5x5, in size 1, out size 32

conv2d(x_image, W_conv1) + b_conv1

激活:卷积之后使用ReLU作为激活函数。原因为增加非线性激活函数,增强拟合复杂函数的能力。

tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # output size 28x28x32

池化:池化窗口的大小设置为了2x2, 窗口在每一个维度上滑动的步长也设置为了2x2,所以图像由28x28x32-->14x14x32。

max_pool_2x2(h_conv1)

第二层卷积,与第一层卷积类似,输入由图像变成第一次卷积后结果,输出图像由14x14x64-->7x7x64

两次卷积之后,是全连接层,输出为1024维的向量

全连接层中加入了Dropout防止神经网络过拟合,选择的Dropout概率keep_prob为0.5,但训练的时候每一个连接都有50%的概率被去除,测试的时候keep_prob为1,即保留所有连接。

再设置一层全连接,将上一步的到的h_fcl_drop转换成10个类别的打分,在使用Softmax函数将其转化成10个类别的概率。

     3.定义损失函数(loss function),选定优化器,并指定优化器优化损失函数

对于多分类问题,通常采用交叉熵(cross-entropy)作为损失函数。交叉熵的定义如下,其中y是预测的概率分布,y’是真实的概率分布:

选择交叉熵作为损失函数,但优化器选择自适应的优化器Adagrad,并把学习率设为0.0001。(Softmax回归函数实现mnist手写数字识别使用的为GradientDescentOptimizer梯度下降算法优化器)

         4.对数据进行迭代训练

模型迭代训练1000次,每次从训练集中随机选出100个样本训练一次。每隔50次训练,打印模型的预测准确率。

         5.在测试集上进行准确率评估。

每一次测试结果准确度的函数定义:

        6.Mnist数据集在Softmax回归函数、深度神经网络DNN、卷积神经网络模型CNN下运行结果。


模型名称


Softmax


DNN


CNN


训练次数


1000


1000


1000


每次样本数


100


100


100


优化器


GradientDescentOptimizer


AdagradOptimizer


AdamOptimizer


学习率


0.5


0.3


0.0001


准确度


0.9128


0.9737


0.9681

1) Softmax回归函数预测准确度为92%左右,训练中会出现过拟合问题,准确度骤降至很低。

2) CNN实验中使用的卷积神经网络为官方demo,样本训练次数加大到20000次时,准确度可以达到99.37%。实验中原程序中卷积层的特征提取窗口大小、维度,池化层中的池化窗口大小、步长,实验中的优化器AdagradOptimizer学习率,都可以作为后续学习中的调参对象。

3) DNN实验中定义了addConnect函数, 4个参数中第1个参数是输入层矩阵Inputs;第2个参数是连接上一层神经元个数in_size; 第3个参数是连接下一层神经元个数;第4个参数是激活函数。

实验中添加第1个连接层,输入参数为784维的图片向量、神经元个数为784、连接下一层的神经元个数300,激活函数ReLU,并将其输出结果赋值给变量connect_1;添加第2个连接层,输入参数为connect_1、神经元个数为300、连接下一层的神经元个数10,激活函数ReLU,并将其输出结果赋值给变量predict_y,即标签预测值。如下图所示:

4) 优化器optimizer:实验中使用了GradientDescentOptimizer、AdamOptimizer,对比可得,AdagradOptimizer在此问题的收敛效果较好。

运行结果截图:

从左到右依次为:Softmax回归函数、DNN、CNN(其中CNN模型在工作站

原文地址:https://www.cnblogs.com/xiaomai0379/p/10462250.html

时间: 2024-11-10 01:26:45

CNN-mnist手写数字识别的相关文章

第三节,TensorFlow 使用CNN实现手写数字识别

上一节,我们已经讲解了使用全连接网络实现手写数字识别,其正确率大概能达到98%,着一节我们使用卷积神经网络来实现手写数字识别, 其准确率可以超过99%,程序主要包括以下几块内容 [1]: 导入数据,即测试集和验证集 [2]: 引入 tensorflow 启动InteractiveSession(比session更灵活) [3]: 定义两个初始化w和b的函数,方便后续操作 [4]: 定义卷积和池化函数,这里卷积采用padding,使得 输入输出图像一样大,池化采取2x2,那么就是4格变一格 [5]

Tensorflow实践 mnist手写数字识别

minst数据集                                         tensorflow的文档中就自带了mnist手写数字识别的例子,是一个很经典也比较简单的入门tensorflow的例子,非常值得自己动手亲自实践一下.由于我用的不是tensorflow中自带的mnist数据集,而是从kaggle的网站下载下来的,数据集有些不太一样,所以直接按照tensorflow官方文档上的参数训练的话还是踩了一些坑,特此记录. 首先从kaggle网站下载mnist数据集,一份是

tensorflow 基础学习五:MNIST手写数字识别

MNIST数据集介绍: from tensorflow.examples.tutorials.mnist import input_data # 载入MNIST数据集,如果指定地址下没有已经下载好的数据,tensorflow会自动下载数据 mnist=input_data.read_data_sets('.',one_hot=True) # 打印 Training data size:55000. print("Training data size: {}".format(mnist.

Pytorch入门实战一:LeNet神经网络实现 MNIST手写数字识别

记得第一次接触手写数字识别数据集还在学习TensorFlow,各种sess.run(),头都绕晕了.自从接触pytorch以来,一直想写点什么.曾经在2017年5月,Andrej Karpathy发表的一片Twitter,调侃道:l've been using PyTorch a few months now, l've never felt better, l've more energy.My skin is clearer. My eye sight has improved.确实,使用p

Caffe 例子使用记录(一)mnist手写数字识别

1. 安装caffe请参考 http://www.cnblogs.com/xuanyuyt/p/5726926.html 2. 下载训练和测试数据.caffe识别leveldb或者lmdb格式的数据,这里提供转换好的LEVELDB格式数据集,解压缩到mnist例子目录下 链接:http://pan.baidu.com/s/1gfjXteV 密码:45j6 3. 打开lenet_solver.prototxt,这里可以自己试着改几个参数看看最终效果 # The train/test net pro

Tensorflow之MNIST手写数字识别:分类问题(2)

整体代码: #数据读取 import tensorflow as tf import matplotlib.pyplot as plt import numpy as np from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) #定义待输入数据的占位符 #mnist中每张照片共有28*28=784个像

三种方法实现MNIST 手写数字识别

MNIST数据集下载: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) #one_hot 独热编码,也叫一位有效编码.在任意时候只有一位为1,其他位都是0 1 使用逻辑回归: import tensorflow as tf # 导入数据集 #fr

keras入门实战:手写数字识别

近些年由于理论知识的硬件的快速发展,使得深度学习达到了空前的火热.深度学习已经在很多方面都成功得到了应用,尤其是在图像识别和分类领域,机器识别图像的能力甚至超过了人类. 本文用深度学习Python库Keras实现深度学习入门教程mnist手写数字识别.mnist手写数字识别是机器学习和深度学习领域的"hello world",MNIST数据集是手写数字的数据集合,训练集规模为60000,测试集为10000. 本文的内容包括: 如何用Keras加载MNIST数据集 对于MNIST问题如何

Kaggle竞赛丨入门手写数字识别之KNN、CNN、降维

引言 这段时间来,看了西瓜书.蓝皮书,各种机器学习算法都有所了解,但在实践方面却缺乏相应的锻炼.于是我决定通过Kaggle这个平台来提升一下自己的应用能力,培养自己的数据分析能力. 我个人的计划是先从简单的数据集入手如手写数字识别.泰坦尼克号.房价预测,这些目前已经有丰富且成熟的方案可以参考,之后关注未来就业的方向如计算广告.点击率预测,有合适的时机,再与小伙伴一同参加线上比赛. 数据集 介绍 MNIST ("Modified National Institute of Standards an