CNN中的MNIST数据集介绍和使用示例

本文概述

  • TensorFlow中的Softmax回归
  • TensorFlow中MNIST数据集的实现
  • TensorFlow MNIST-训练
MNIST(美国国家标准技术研究院, 修改版)数据库是一个大型的手写数字或数字数据库, 用于训练各种图像处理系统。该数据集还广泛用于机器学习领域的训练和测试。 MNIST数据库中的图像集是两个NIST数据库的组合:特殊数据库1和特殊数据库3。
MNIST数据集具有60, 000个训练图像和10, 000个测试图像。
MNIST数据集可以在线, 并且本质上是各种手写数字的数据库。 MNIST数据集包含大量数据, 通常用于证明深度神经网络的真正功能。我们的大脑和眼睛协同工作以识别任何编号的图像。我们的思维是一种强大的工具, 并且能够快速对任何图像进行分类。数字的形状太多了, 我们的大脑可以轻松识别这些形状并确定数字是多少, 但是对于计算机而言, 完成相同的任务并不容易。只有一种方法可以做到这一点, 那就是使用深度神经网络, 它允许我们训练计算机以有效地对手写数字进行分类。
CNN中的MNIST数据集介绍和使用示例

文章图片
因此, 我们只处理了笛卡尔坐标系上包含简单数据点的数据。从开始到现在, 我们一直在分发二进制类数据集。当我们使用多类数据集时, 我们将使用Softmax激活函数对分类二进制数据集非常有用。而且在0到1之间的值排列中非常有效。sigmoid函数对于多因果数据集无效, 为此, 我们使用了能够处理它的softmax激活函数。
MNIST数据集是一个包含10个类的多级数据集, 我们可以在其中分类0到9之间的数字。我们之前使用的数据集与MNIST数据集之间的主要区别是在神经网络中输入MNIST数据的方法。
【CNN中的MNIST数据集介绍和使用示例】在感知模型和线性回归模型中, 每个数据点均由简单的x和y坐标定义。这意味着输入层需要两个节点才能输入单个数据点。
在MNIST数据集中, 单个数据点以图像形式出现。 MNIST数据集中包含的这些图像通常为28 * 28像素, 例如与水平轴交叉的28个像素和与垂直轴交叉的28个像素。这意味着来自MNIST数据库的单个图像总共需要分析784个像素。我们的神经网络的输入层有784个节点来解释这些图像之一。
CNN中的MNIST数据集介绍和使用示例

文章图片
在这里, 我们将看到如何创建一个函数, 该函数是通过查看图像中的每个像素来识别手写数字的模型。然后使用TensorFlow训练模型, 以通过查看已标记的数千个示例来预测图像。然后, 我们将使用测试数据集检查模型的准确性。
TensorFlow中的MNIST数据集, 包含分为三部分的手写数字信息:
  • 训练数据(mnist.train)-55000个数据点
  • 验证数据(mnist.validate)-5000数据点
  • 测试数据(mnist.test)-10000个数据点
在开始之前, 请务必注意, 每个数据点都有两个部分:一个图像(x)和一个描述实际图像的相应标签(y), 并且每个图像都是28× 28的数组, 即784个数字。图像的标签是与TensorFlow MNIST图像相对应的0到9之间的数字。要下载和使用MNIST数据集, 请使用以下命令:
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

CNN中的MNIST数据集介绍和使用示例

文章图片
TensorFlow中的Softmax回归 TensorFlow MNIST的十种可能性是从0到9。我们的目的是查看图像, 并以特定的可能性说给定的图像是特定的数字。如果有可能, 则使用Softmax, 因为回归可以使我们得出0到1之间的值, 这些值总计为1。因此, 我们的方法应该很简单。
CNN中的MNIST数据集介绍和使用示例

文章图片
CNN中的MNIST数据集介绍和使用示例

文章图片
我们将TensorFlow MNIST图像分类为特定类别, 然后将其表示为正确与否的概率。现在, 这完全取决于特定类中的所有对象, 并且我们可以对像素强度进行加权求和。我们还需要添加一个偏见, 以使某些事情更可能独立于输入而已。 Softmax对权重进行归一化并添加假设为负或零的权重。
TensorFlow中MNIST数据集的实现 使用TensorFlow MNIST数据集分类的好处是, 它使我们可以描述完全在Python外运行的交互操作的图形。
首先, 我们使用以下命令导入TensorFlow库
Import tensorflow as tf

然后我们创建一个占位符, 当我们要求库使用以下命令运行计算时将输入该值
x = tf.placeholder (tf.float32, [None, 784])

然后, 我们应该在模型中增加权重和偏差。使用变量, 这是一个可修改的张量, 在交互操作图中具有作用域。
W= tf.Variable (tf.zeros([784, 10])) b= tf.Variable(tf.zeros([10]))

请注意, W的形状为[784, 10], 因为我们要通过将784维图像矢量乘以10维证据矢量来生成不同类别的证据。我们可以将b添加到输出中, 因为它的形状为[10]。
TensorFlow MNIST-训练 我们通过将特征矩阵乘以权重并向其添加偏差, 然后通过softmax函数运行来定义模型。
y = tf.nn.softmax(tf.matmul(x, W) +b)

我们使用成本函数或均方误差函数来找到结果与实际数据的偏差。误差越小, 模型越好。当测量我们的预测效率如何时, 另一个非常常见的功能是交叉熵。该函数如下所述, 其中y表示预测, y’ 是实际分布。我们通过添加一个占位符来实现它。
y_ =tf.placeholder(tf.float32, [None, 10])

然后通过定义交熵
cross_entropy= tf.reduce_mean(-tf.reduce_sum(y_ *tf.log(y), reduction_indices=[1]))

现在我们已经成功定义了模型, 是时候训练它了。我们可以借助梯度下降和反向传播来做到这一点。还有许多其他优化算法可用, 例如逻辑回归, 动态松弛等。我们可以将学习效率为0.5的梯度下降用于成本函数优化。
train_step= tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

在训练之前, 我们需要开始一个会话并初始化我们之前创建的变量。
sess= tf.InteractiveSession()

这将启动一个交互式会话, 并通过以下方式初始化变量
tf.global_variables_initializer().run()

现在, 我们必须训练网络。我们应该更改时期数以适合我们的模型。
for _in range (1000): batch_xs, batch_ys =mnist.train.next_batch(100) sess.run(train_step, feed_dict={x:batch_xs, y_:batch_ys})

使用测试数据集检查准确性
我们通过将结果与测试数据集进行比较来检查准确性。在这里, 我们可以使用tf.argmax函数, 该函数使我们知道沿着特定轴的张量中最大值的索引。
correct_prediction = tf.equal (tf.argmax (y, 1), tf.argmax(y_, 1))

这给出了布尔值列表, 然后在转换为浮点数后取平均值。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

然后, 我们可以通过
print (sess.run (accuracy, feed_dict= {x: mnist.test.images, y_:mnist.test.labels}))

    推荐阅读