深度学习入门笔记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


相关文章
|
2月前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
3月前
|
机器学习/深度学习 算法 测试技术
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
本文是关于如何搭建深度学习环境,特别是使用mmdetection进行CPU安装和训练的详细指南。包括安装Anaconda、创建虚拟环境、安装PyTorch、mmcv-full和mmdetection,以及测试环境和训练目标检测模型的步骤。还提供了数据集准备、检查和网络训练的详细说明。
167 5
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
|
3月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
70 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
3月前
|
机器学习/深度学习 数据可视化 Windows
深度学习笔记(七):如何用Mxnet来将神经网络可视化
这篇文章介绍了如何使用Mxnet框架来实现神经网络的可视化,包括环境依赖的安装、具体的代码实现以及运行结果的展示。
64 0
|
1月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
82 3
|
2月前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)入门
【10月更文挑战第41天】在人工智能的璀璨星空下,卷积神经网络(CNN)如一颗耀眼的新星,照亮了图像处理和视觉识别的路径。本文将深入浅出地介绍CNN的基本概念、核心结构和工作原理,同时提供代码示例,带领初学者轻松步入这一神秘而又充满无限可能的领域。
|
3月前
|
机器学习/深度学习
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
本文探讨了深度可分离卷积和空间可分离卷积,通过代码示例展示了它们在降低计算复杂性和提高效率方面的优势。
325 2
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
|
3月前
|
机器学习/深度学习 并行计算 PyTorch
深度学习环境搭建笔记(一):detectron2安装过程
这篇博客文章详细介绍了在Windows环境下,使用CUDA 10.2配置深度学习环境,并安装detectron2库的步骤,包括安装Python、pycocotools、Torch和Torchvision、fvcore,以及对Detectron2和PyTorch代码的修改。
612 1
深度学习环境搭建笔记(一):detectron2安装过程
|
3月前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
458 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
3月前
|
机器学习/深度学习 自然语言处理 并行计算
深度学习笔记(十四):Transormer知识总结
关于深度学习中Transformer模型的知识总结,涵盖了Self-attention机制、QKV、Multi-head attention、位置编码和并行运算等关键概念,以及如何在PyTorch中实现Self-attention。
74 1