深度学习入门笔记7 手写数字识别

简介: 深度学习入门笔记7 手写数字识别

手写数字识别

MNIST数据集(修改的国家标准与技术研究所——Modified National Institute of Standards and Technology),是一个大型的包含手写数字图片的数据集。该数据集由0-9手写数字图片组成,共10个类别。每张图片的大小为28 * 28。

加载必要的库。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt

下载数据集

调用read_data_sets,可以下载mnist数据集到指定的目录,如果目录不存在,可自定创建。

如果数据已经下载,则直接从文件中提取数据。

说明:

如果因为网络原因,导致下载不成功,可以去MNIST官网进行下载。

# 通过指定的路径(第1个参数)获取(加载)手写数字数据集。如果指定的路径中文件
# 不存在,则会进行下载。(下载速度可能非常慢)。
# 如果文件已经存在,则直接使用。
mnist = input_data.read_data_sets("data/", one_hot=True)

MNIST数据集查看

MNIST数据集共有70000张图像,其中训练集60000张,测试集10000张。训练集分为55000张训练图像与5000张验证图像。

MNIST图像为单通道。

display(mnist.train.images.shape)
display(mnist.train.labels.shape)
mnist.train.labels[0]
• 1

显示指定的图

可以通过matplotlib库显示指定的图像。

plt.imshow(mnist.train.images[1].reshape((28, 28)), cmap="gray")

实现

我们使用单层神经网络来实现该任务。使用softmax激活函数。

图像的每个像素可以看做一个特征,而每个像素点对应着一个权重,来衡量该像素点对目标的影响大小。

# 定义输入。
X = tf.placeholder(dtype=tf.float32, shape=[None, 784])
y = tf.placeholder(dtype=tf.float32, shape=[None, 10])
# W = tf.Variable(tf.random_normal(shape=[784, 10], stddev=0.1))
# 对于单层的神经网络,权重初始化不那么重要,但是对于多层神经网络,权重的初始化就比较重要了。
W = tf.Variable(tf.zeros(shape=[784, 10]))
b = tf.Variable(tf.zeros(shape=[1, 10]))
# 计算净输入。(logits值)
z = tf.matmul(X, W) + b
#  多分类,使用softmax。传递logits值,返回属于每个类别的概率。
a = tf.nn.softmax(z)
# 定义交叉熵损失函数。
loss = -tf.reduce_sum(y * tf.log(a))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
# tf.argmax(y, axis=1) 求真实的类别的索引。
# tf.argmax(a, axis=1) 求预测的类别的索引。
# correct是一个布尔类型的张量。
correct = tf.equal(tf.argmax(y, axis=1), tf.argmax(a, axis=1))
# 计算准确率。
rate = tf.reduce_mean(tf.cast(correct, tf.float32))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1, 3001):
        batch_X, batch_y = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={X: batch_X, y: batch_y})
        if i % 500 == 0:
            # 传入测试数据,查看测试集上的准确率。
            print(sess.run(rate, feed_dict={X: mnist.test.images, y: mnist.test.labels}))

0.894

0.92

0.9183

0.9031

0.9207

0.9152

改进

采用中间加入一隐藏层(多层神经网络)来实现,查看准确率是否改善。

X = tf.placeholder(dtype=tf.float32, shape=[None, 784])
y = tf.placeholder(dtype=tf.float32, shape=[None, 10])
# 如果将权重初始化为0,则准确率非常低。10%左右。
# W = tf.Variable(tf.zeros(shape=[784, 256]))
# 如果标准差设置不当,准确率也非常低。
# W = tf.Variable(tf.random_normal(shape=[784, 256], stddev=0.05))
# 使用标准正态分布,标准差0.05,准确率为97%左右。
# W = tf.Variable(tf.random_normal(shape=[784, 256], stddev=0.05))
# 也可以使用截断正态分布,准确率与标准正态分布差不多。使用截断正态分布时,标准差设置为0.1不会出现问题。
W = tf.Variable(tf.truncated_normal(shape=[784, 256], stddev=0.1))
b = tf.Variable(tf.zeros(shape=[1, 256]))
z = tf.matmul(X, W) + b
# 使用Relu激活函数。a是当前层神经元的输出值,会作为下一层神经元的输入值。
a = tf.nn.relu(z)
# W2 = tf.Variable(tf.random_normal(shape=[256, 10], stddev=0.05))
W2 = tf.Variable(tf.truncated_normal(shape=[256, 10], stddev=0.1))
b2 = tf.Variable(tf.zeros(shape=[1, 10]))
z2 = tf.matmul(a, W2) + b2
a2 = tf.nn.softmax(z2)
loss = -tf.reduce_sum(y * tf.log(a2))
# 这里不再计算softmax,再计算交叉熵,而是直接用tf.nn.softmax_cross_entropy_with_logits直接计算。
# 但是,使用该方法后,准确率有所下降。
# loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=z2, labels=y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
correct = tf.equal(tf.argmax(y, axis=1), tf.argmax(a2, axis=1))
# correct = tf.equal(tf.argmax(y, axis=1), tf.argmax(z2, axis=1))
rate = tf.reduce_mean(tf.cast(correct, tf.float32))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1, 3001):
        batch_X, batch_y = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={X: batch_X, y: batch_y})
        if i % 500 == 0:
            print(sess.run(rate, feed_dict={X: mnist.test.images, y: mnist.test.labels}))

0.9619

0.9716

0.9749

0.974

0.9773

0.9746


相关文章
|
22天前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习的最佳入门路线
深度学习的最佳入门路线
|
19天前
|
机器学习/深度学习 数据可视化 TensorFlow
使用TensorFlow进行深度学习入门
【5月更文挑战第18天】本文介绍了TensorFlow深度学习入门,包括TensorFlow的概述和一个简单的CNN手写数字识别例子。TensorFlow是由谷歌开发的开源机器学习框架,以其灵活性、可扩展性和高效性著称。文中展示了如何安装TensorFlow,加载MNIST数据集,构建并编译CNN模型,以及训练和评估模型。此外,还提供了预测及可视化结果的代码示例。
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
使用TensorFlow进行深度学习入门
【5月更文挑战第11天】本文引导读者入门TensorFlow深度学习,介绍TensorFlow——Google的开源机器学习框架,用于处理各种机器学习问题。内容包括TensorFlow安装(使用pip)、核心概念(张量、计算图和会话)以及构建和训练简单线性回归模型的示例。通过这个例子,读者可掌握TensorFlow的基本操作,包括定义模型、损失函数、优化器以及运行会话。
|
22天前
|
机器学习/深度学习 自然语言处理 语音技术
【Python 机器学习专栏】Python 深度学习入门:神经网络基础
【4月更文挑战第30天】本文介绍了Python在深度学习中应用于神经网络的基础知识,包括神经网络概念、基本结构、训练过程,以及Python中的深度学习库TensorFlow和PyTorch。通过示例展示了如何使用Python实现神经网络,并提及优化技巧如正则化和Dropout。最后,概述了神经网络在图像识别、语音识别和自然语言处理等领域的应用,并强调掌握这些知识对深度学习的重要性。随着技术进步,神经网络的应用将持续扩展,期待更多创新。
|
22天前
|
机器学习/深度学习 Python
【深度学习入门】- Matlab实现图片去重
【深度学习入门】- Matlab实现图片去重
|
22天前
|
机器学习/深度学习 Python
【深度学习入门】- 神经网络
【深度学习入门】- 神经网络
|
22天前
|
机器学习/深度学习
【深度学习入门】- 用电路思想解释感知机
【深度学习入门】- 用电路思想解释感知机
|
5天前
|
机器学习/深度学习 自然语言处理 算法
深度学习在图像识别中的应用
本文将探讨深度学习在图像识别领域的重要性和应用。随着科技的发展,图像识别已经成为了计算机视觉领域的一个重要分支。深度学习作为一种强大的机器学习方法,已经在图像识别中取得了显著的成果。本文将详细介绍深度学习的原理、模型和算法,并分析其在图像识别中的应用和挑战。
|
1天前
|
机器学习/深度学习 数据挖掘
探索深度学习在生物信息学中的应用
【6月更文挑战第5天】深度学习在生物信息学中广泛应用于基因序列分析、蛋白质结构预测和疾病诊断,利用CNN、LSTM、GNN等模型提升研究准确性。最新成果包括在单细胞测序数据分析和药物发现中的应用。未来趋势将聚焦多组学数据整合、提高模型可解释性和加强跨领域合作,深度学习将持续推动生物信息学领域的发展。
|
1天前
|
机器学习/深度学习 人工智能 算法
深度学习在图像识别中的应用
【6月更文挑战第4天】本文将探讨深度学习技术在图像识别领域的应用。随着人工智能的不断发展,深度学习已经成为计算机视觉领域的重要工具。我们将介绍深度学习的基本原理和关键技术,并分析其在图像识别中的优势和挑战。通过具体案例,我们将展示深度学习如何提高图像识别的准确性和效率。