05_利用神经网实现MINST手写数字识别

本文介绍如何利用Python和Tensorflow构建神经网络,实现MNIST手写数字识别。通过Softmax Regression算法训练模型,经过评估优化,达到识别手写数字的目的。实验涉及数据集加载、模型构建、训练与测试,适合熟悉Python和深度学习的读者。
部署运行你感兴趣的模型镜像

利用神经网实现MNIST手写数字识别

1、实验描述

  • 使用Python编程,输入为MNIST训练数据集,首先通过Tensorflow载入MNIST数据集并进行相应的特征提取等处理,其次采用Softmax
    Regression算法对数据集进行概率估算,然后训练模型构建神经网络,通过评估来对模型进一步地调整优化,进而便可以根据优化的模型预测识别新的手写数字。

  • 实验时长:45分钟

  • 主要步骤:

    • MNIST数据集加载

    • Softmax Regression算法进行概率估算

    • 训练测试模型构建神经网络

    • 评估模型计算准确率

2、实验环境

  • 系统版本:CentOS7

  • Python版本:3.6.5

  • Matplotlib版本:Matplotlib 2.2.2

  • Anaconda版本:Anaconda3.4.1

  • Numpy版本:1.14.3

  • scikit-learn版本:0.19.1

3、相关技能

  • Python编程

  • Softmax Regression构建神经网络

  • Tensorflow编程

4、相关知识点

  • MNIST概述

    • MNIST是一个计算机视觉数据集,它包含70000张手写数字的灰度图片,其中每一张图片包含28*28个像素点。可以用一个数字数组来表示这张图片:

在这里插入图片描述

每一张图片都有对应的标签,也就是图片对应的数字,例如上面图片的标签为1。

  • 数据集被分成两部分:60000行的训练数据集和10000行的测试数据集。其中:60000行的训练集分拆为55000行的训练集和5000行的验证集。

60000行的训练数据是一个形状为[60000,784]的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。60000行的训练数据集标签是介于0到9的数字,用来描述给定图片里表示的数字,称为“one-hot
vectors”。一个one-hot向量除了某一位的数字是1以外,其余各维度数字都是0。

  • Tensorflow编程模型简介与使用

  • Tensorflow是一个采用数据流图,用于数值计算的开源软件库。节点在图中表示数学操作,图中的线则表示在节点间相互联系的多维数据数组,即张量。Tensorflow的计算表示为一个计算图,图中的每个节点可以有任意多个输入和输出,每个节点描述了一种运算操作。

  • 在Tensorflow中,使用图(graph)来表示计算任务,在被称之为会话(session)的上下文(context)中执行图,使用tensor表示数据,通过变量(variable)维护状态,使用feed和fetch可以为任意的操作赋值或从其中获取数据。

  • Softmax Regression算法

  • Softmax
    Regression是Logistic回归的推广,Logistic回归是处理二分类问题的,而Softmax
    Regression是处理多分类问题的。Softmax
    Regression将可以判定为某类的特征相加,然后将这些特征转化为判定是这一类的概率,估算这一类的概率,将概率最大的作为结果输出。求出以下的概率值:

在这里插入图片描述

损失函数为

在这里插入图片描述

其中I{·}是一个指示性函数,意思是大括号里的值为真时,该函数的结果为1,否则为0。

  • 神经网络

  • 神经网络是将许多个单一“神经元”联结在一起,一个“神经元”的输出是另一个“神经元”的输入。下图即为一个简单的神经网络:

在这里插入图片描述

圆圈表示神经网络的输入,标上“+1”的圆圈称为偏置节点。神经网络最左边的一层为输入层,最右边一层为输出层,中间所有节点组成一层叫做隐藏层。

  • 神经网络主要包括三个部分:结构、激励函数、学习规则。对于一个神经网络,存在输入层、隐藏层和输出层。除了输入层,每一层的节点都包含一个非线性变换,使得神经网络可以拟合任意一个函数。对于每一层的神经元,都在激励函数的作用下工作,激励函数通常是sigmoid、tanh、relu等。另外,神经网络也存在不同的算法来训练学习,例如前馈型、反馈型和自组织。通过不断的学习,能够得到一个模型,对输入预测出一个期望的输出。

5、实现效果

  • 神经网训练过程输出及最终结果如下图:

在这里插入图片描述

图 1

6、实验步骤

6.1进入/home/zkpk/pycharm-2017.3.5/bin目录,切换到root用户,输入密码(zkpk)

[zkpk@localhost tgz]$ cd ~/pycharm-2017.3.5/bin
[zkpk@localhost bin]$ su root

在这里插入图片描述

图 2

修改hosts文件,在/etc/hosts文件末添加一行0.0.0.0
account.jetbrains.com,注意account前面有一个空格(按I键,添加以下内容后按Esc键,输入:wq,再按Enter键即可保存退出)。修改完成后使用exit命令退出root权限。

[root@localhost bin]# vi /etc/hosts
0.0.0.0 account.jetbrains.com

在这里插入图片描述

图 3

在/home/zkpk/pycharm-2017.3.5/bin目录下,使用./pycharm.sh命令打开Pycharm,点击create
new project创建工程NeuralNetwork,在工程下创建minst_simpleNN.py并设置Python
Interpreter。
在这里插入图片描述

图 4

在这里插入图片描述

图 5

6.2复制home/zkpk/experiment文件夹下的MINST数据集MINST_data文件夹到工程目录下。并创建minst_simpleNN.py文件。

在这里插入图片描述

图 6

6.3Import相关工具包。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

在这里插入图片描述

图 7

6.4使用tensorflow定义好的函数读取minst数据。

	# Import data
mnist = input_data.read_data_sets("/home/zkpk/PycharmProject/NeuralNetwork/MNIST_data/", one_hot=True)

6.5定义神经网络参数,学习率,训练次数,batch大小,训练多少次输出测试结构。以及第一层网络大小,第二层网络大小,数据输入大小,分类数。

	# parameters
learning_rate = 0.1
num_steps = 500
batch_size = 128
display_step = 100

# network parameters
n_hidden_1 = 256
n_hidden_2 = 256
num_inputs = 784
num_classes = 10

在这里插入图片描述

图 8

6.6用tf.Variable函数初始化训练参数。

# initalize weights
Weights = {
  'h1': tf.Variable(tf.random_normal([num_inputs, n_hidden_1])),
  'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
  'out': tf.Variable(tf.random_normal([n_hidden_2, num_classes]))
}

biases = {
  'b1': tf.Variable(tf.random_normal([n_hidden_1])),
  'b2': tf.Variable(tf.random_normal([n_hidden_2])),
  'out': tf.Variable(tf.random_normal([num_classes]))

}

在这里插入图片描述

图 9

6.7定义神经网,并使用输入数据训练神经网。

def nerual_net(x):
  	layer_1 = tf.add(tf.matmul(x, Weights['h1']), biases['b1'])
  	layer_2 = tf.add(tf.matmul(layer_1, Weights['h2']), biases['b2'])
  	out_layer = tf.add(tf.matmul(layer_2, Weights['out']), biases['out'])
  	return out_layer
# construct model
logits = nerual_net(X)

在这里插入图片描述

图 10

6.8定义损失和优化函数,训练目标。

# define loss and optimizer
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y,logits=logits))
# tf.reduce_mean(input_tensor,reduction_indices=None,keep_dims=False,name=None) Computes the mean of elements across dimensions of a tensor. (reduction_indices)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train_op = optimizer.minimize(loss_op)

# evaluate model
correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

在这里插入图片描述

图 11

6.9初始化所有参数。

# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()

在这里插入图片描述

图 12

6.10训练神经网,分batch读入数据,每100次训练,输出神经网训练结果。500次训练结束后,优化结束,计算测试准确率。

with tf.Session() as sess:
  sess.run(init)

  for step in range(1, num_steps + 1):
    batch_x, batch_y = mnist.train.next_batch(batch_size)

    sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})
    if step % display_step == 0 or step == 1:
      # calculate acc and loss
      loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, Y: batch_y})
      print("Step " + str(step) + ", Minibatch Loss= " + \
            "{:.4f}".format(loss) + ", Training Accuracy= " + \
            "{:.3f}".format(acc))

  print("optimization finished!")

  # Calculate accuracy for MNIST test images
  print("Testing Accuracy:", \
        sess.run(accuracy, feed_dict={X: mnist.test.images,
                                      Y: mnist.test.labels}))

在这里插入图片描述

图 13

6.11右键点击‘run ‘minst_simpleNN‘’运行程序,训练神经网。

在这里插入图片描述

图 14

6.12神经网训练过程输出及最终结果如下图:

在这里插入图片描述

图 15

7、参考答案

  • 代码清单NeuralNetwork.minst_simplyNN.py:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

图 16

8、总结

完成本实验可掌握构建基本神经网络来对minst数据集进行分类,以及搭建基本神经网框架。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JTZ001

你的鼓励是我创作的最大动力?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值