如何使用Tensorflow定义MNIST数据集的模型?

如何使用Tensorflow定义MNIST数据集的模型?

概述

MNIST数据集是图像识别领域中的经典数据集,包含了手写数字的灰度图像和对应的标签,是很多图像识别算法的基础。Tensorflow是目前应用广泛的机器学习框架之一,它提供了方便的API和工具使得模型构建和训练更加便捷。在这篇文章中,我们将通过Tensorflow构建一个简单的图像分类模型,使用MNIST数据集作为输入数据,并用训练集和测试集分别评估模型的性能。

更多Python文章,请阅读:Python 教程

步骤

1.准备数据集

首先,我们需要下载 MNIST 数据集,并把它转化成运用在模型上的形式。Tensorflow 提供了 fetch_mldata 函数方便地下载 MNIST 数据集。同时我们还需要对数据进行归一化。以下是数据集准备代码。

from sklearn.datasets import fetch_openml
import numpy as np

mnist = fetch_openml('mnist_784',version=1)

x_all = mnist.data.astype(np.float32)/255.0
y_all = mnist.target.astype(np.int32)

2.划分数据集

我们需要将数据集分为训练集和测试集。训练集用于建立模型,测试集用于评估模型。以下是数据集划分代码。

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_all, y_all, test_size=0.10, random_state=42)

3.定义模型

定义模型是利用Tensorflow构建我们的图像分类器的第一步。在这个模型中,我们将使用一个三层的全连接神经网络,每个层之间有一定数量的节点。以下是模型定义代码。

import tensorflow as tf

tf.reset_default_graph()

n_input = x_train.shape[1]
n_output = np.max(y_train)+1
n_hidden_1 = 256
n_hidden_2 = 128

x = tf.placeholder(tf.float32, [None, n_input], name='x')
y = tf.placeholder(tf.int32, [None], name='y')

with tf.name_scope('model'):
    hidden_1 = tf.layers.dense(x, n_hidden_1, activation=tf.nn.relu, name='hidden_1')
    hidden_2 = tf.layers.dense(hidden_1, n_hidden_2, activation=tf.nn.relu, name='hidden_2')
    logits = tf.layers.dense(hidden_2, n_output, name='logits')

这里我们通过定义四个变量:n_input、n_output、n_hidden_1、n_hidden_2,分别表示输入层的节点数、输出层的节点数,以及两个隐藏层中每层节点的数量。

之后,我们定义了一个占位符(placeholder)来存储输入张量 x 和 y,在创建神经网络层时,我们将使用layers.dense()函数,其中一个有效实现中这个函数会返回一个新的层对于所有输入 x 的输出。输入的参数有三个,x代表输入张量,n_hidden_1代表隐藏层1的节点数量,n_hidden_2代表隐藏层2的节点数量,activation 参数代表激活函数,relu 表示 Rectified Linear Unit。对于输出层,我们省略了激活函数。

4.定义损失函数和优化器,并定义评估标准

定义反向传播和优化器的目的是训练模型并最小化损失。我们使用了Tensorflow中Graph API 生成计算图。

训练模型的时候,我们需要选择一个损失函数来衡量模型的误差。在本例子中,我们将使用交叉熵损失函数。接着,我们使用梯度下降优化器来最小化损失。最后,我们定义准确率作为评估模型的标准。

with tf.name_scope('loss'):
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
    loss = tf.reduce_mean(cross_entropy)

with tf.name_scope('train'):
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    train_op = optimizer.minimize(loss)

with tf.name_scope('eval'):
    correct_prediction = tf.equal(tf.cast(tf.argmax(logits, axis=1), tf.int32), y)
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

5.训练模型

我们已经定义了模型,并且定义了反向传播和优化器。下一步是训练模型。训练模型需要反复迭代,每次迭代都要在训练集上批量地优化模型。

batch_size = 128
n_epochs = 1000

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

    for epoch in range(n_epochs):
        n_batches = len(x_train) // batch_size
        for batch_index in range(n_batches):
            x_batch, y_batch = x_train[batch_index*batch_size:(batch_index+1)*batch_size], \
                               y_train[batch_index*batch_size:(batch_index+1)*batch_size]
            sess.run(train_op, feed_dict={x: x_batch, y: y_batch})

        accuracy_train = sess.run(accuracy, feed_dict={x: x_train, y: y_train})
        accuracy_test = sess.run(accuracy, feed_dict={x: x_test, y: y_test})
        print('Epoch: {}, Train Accuracy: {:.2f}%, Test Accuracy: {:.2f}%'.format(epoch+1, accuracy_train*100, accuracy_test*100))

6.测试模型

使用测试集评估模型性能。

with tf.Session() as sess:
    saver = tf.train.Saver()
    saver.restore(sess, './model')

    accuracy_test = sess.run(accuracy, feed_dict={x: x_test, y: y_test})
    print('Test Accuracy: {:.2f}%'.format(accuracy_test*100))

结论

本文介绍了如何使用Tensorflow构建一个简单的图像分类器,并使用MNIST数据集作为输入数据。通过分别在训练集和测试集上评估模型性能,我们可以看到不同的训练 epoch 和 batch size 对于最终结果的影响。同时,通过模型的训练和测试,我们也可以看到Tensorflow在图像识别方面的应用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程