tensorflow-mnist手写数字识别

mnist数据集

数据集简介

mnist手写数字数据集分为训练集和测试集,其中训练集有60000张图片,测试集有10000张图片。每张图片都是灰度图像,像素取值范围从0~255,图片大小为28×28,并且每张图片都对应0~9中的一个数字。
更多关于mnist手写数字数据集的介绍,点这
图片例子如下:
0
1
3
9

图像质量问题

数据集中绝大部分图像都可以很轻松地辨别出是哪个数字,但仍存在一小部分图像很难分辨出数字。
图片例子如下:
unknown
unknown

显示图片

'''tensorflow version: 1.0.0'''
from tensorflow.examples.tutorials.mnist import input_data

# 以下是导入的input_data.py的代码

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

import gzip
import os
import tempfile

import numpy
from six.moves import urllib
from six.moves import xrange
import tensorflow as tf
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets

# read_data_sets是一个函数,专门用来读取mnist数据集。
# 其中这个函数将训练集分为两部分,55000张图片作为训练集,5000张图片作为验证集。
'''tensorflow version: 1.0.0'''
# 将以下代码保存为py文件,修改数据集路径后可直接运行

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

# data_dir是数据集的路径,注意四个文件应当在同一个文件夹中
data_sets = input_data.read_data_sets('data_dir')

# 分别输出训练集,验证集,测试集的图片数量
print('number of images in training set: %d' % data_sets.train.num_examples)
print('number of images in validation set: %d' % data_sets.validation.num_examples)
print('number of images in testing set: %d' % data_sets.test.num_examples)

# 显示图片
image, label = data_sets.train.next_batch(2)
print('label: %d' % label[1])
plt.imshow(image[1].reshape(28, 28), cmap='gray')
plt.axis('off')
plt.show()

# 这里解释下为什么显示image[1]而不显示image[0]
# image[0]图片显示像数字3,但标签label却是7

tensorflow-mnist

官方tensorflow-mnist代码,点这
官方tensorflow-mnist教程,点这(需翻墙)

'''tensorflow version: 1.0.0'''
# 将这份文件保存为mnist_fcn.py

import math

import tensorflow as tf

# 图片大小是28 * 28
IMAGE_PIXELS = 28 * 28

# 类别10个,分别对应数字0~9
NUM_CLASSES = 10


# 这个函数是创建一个隐层
# 参数分别表示隐层的名字,流入数据,隐层单元个数及激活函数
# 如果不使用激活函数则为输出层
def layer(name, data_in, shape, activate):
    with tf.name_scope(name):
        weights = tf.Variable(
            tf.truncated_normal(shape, stddev=1 / math.sqrt(float(shape[0]))),
            name='weights'
            )
        biases = tf.Variable(
            tf.zeros([shape[1]]),
            name='biases'
        )

        if activate is None:
            # 注意网络的输出没有进行softmax
            data_out = tf.matmul(data_in, weights) + biases
        else:
            data_out = activate(tf.matmul(data_in, weights) + biases)
    return data_out


# 定义网络结构
# 参数分别表示输入图像,各隐层单元个数
# 这个网络只有3个隐层,hidden_units = [x, y, z],分别表示各隐层神经元个数
# 返回预测的值

# 计算损失的函数tf.nn.sparse_softmax_cross_entropy_with_logits
# 需要输入原始预测的值,所以这里不用进行softmax

# 以下简单说下什么是softmax
# 通俗来说对每个样本预测的10个值,每个值都表示属于0~9的一个概率
# 但原始输出的10个值有正有负,大小也不在0~1之间,不能表示概率
# 所以需要进行softmax,对预测值归一化,使其满足概率的定义

# !!!!!!!!!!注意这里不需要归一化!!!!!!!!!!
def model(images, hidden_units):
    data_out_h1 = layer(
        name='hidden1',
        data_in=images,
        shape=[IMAGE_PIXELS, hidden_units[0]],
        activate=tf.nn.relu
    )
    data_out_h2 = layer(
        name='hidden2',
        data_in=data_out_h1,
        shape=[hidden_units[0], hidden_units[1]],
        activate=tf.nn.relu
    )
    data_out_h3 = layer(
        name='hidden3',
        data_in=data_out_h2,
        shape=[hidden_units[1], hidden_units[2]],
        activate=tf.nn.relu
    )

    logits = layer(
        name='softmax',
        data_in=data_out_h3,
        shape=[hidden_units[2], NUM_CLASSES],
        activate=None
    )
    return logits


# 定义损失函数
# 参数分别是模型预测值,真实的值
# 返回一个batch_size的平均损失
def loss(logits, labels):
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
        labels=labels, logits=logits, name='cross_entropy'
    )
    return tf.reduce_mean(cross_entropy, name='loss')


# 定义优化器
# 参数分别是损失值,学习率
# 这里采用梯度下降算法
# 返回训练网络的操作
def optimizer(loss, learning_rate):
    opt = tf.train.GradientDescentOptimizer(learning_rate)
    train_op = opt.minimize(loss)
    return train_op


# 定义评价函数
# 参数分别是模型预测值,真实的值
# 返回预测正确的个数
# 比如说100张图片,预测正确80张,则返回80
def evaluation(logits, labels):
    correct = tf.nn.in_top_k(logits, labels, 1)
    return tf.reduce_sum(tf.cast(correct, tf.int32))
'''tensorflow version: 1.0.0'''
# 将这份文件保存为train_and_eval.py
# 可直接运行,训练网络
# 记得修改数据集的路径
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

import mnist_fcn


# 这个函数的作用是得到每次训练所需要的数据
def fill_feed_dict(data_set, batch_size,
                   images_pl, labels_pl):
    images, labels = data_set.next_batch(batch_size)
    feed_dict = {
        images_pl: images,
        labels_pl: labels
    }
    return feed_dict


# 这个函数是每训练一定步数,就会在给定的数据集上测试性能
# 比如在run_training函数中,每训练1000步
# 会给出在训练集(training_set),验证集(validation set)和测试集(testing set)
# 样本总数,正确分类的样本数和精度
def do_eval(sess, data_set, batch_size,
            images_pl, labels_pl, eval_correct):
    true_counts = 0
    steps = data_set.num_examples // batch_size
    num_examples = steps * batch_size
    for step in range(steps):
        feed_dict = fill_feed_dict(
            data_set, batch_size,
            images_pl, labels_pl
        )
        true_counts += sess.run(eval_correct, feed_dict=feed_dict)
    precision = float(true_counts) / num_examples
    print('Num examples: %d, num correct: %d, precision @ 1 : %.4f' %
          (num_examples, true_counts, precision))


def run_training(data_dir, batch_size, hidden_units,
                 learning_rate, max_steps):

    # 读入数据,这时候data_sets包含3个数据集
    # 训练集,验证集和测试集
    data_sets = input_data.read_data_sets(data_dir)

    # 在默认的图中创建整个模型
    with tf.Graph().as_default():

        # 定义placeholder,用来向网络中传入数据
        images_pl = tf.placeholder(
            tf.float32, shape=(batch_size, mnist_fcn.IMAGE_PIXELS)
        )
        labels_pl = tf.placeholder(
            tf.int64, shape=(batch_size)
        )

        # 图片输入网络,得到预测值
        logits = mnist_fcn.model(images_pl, hidden_units)

        # 得到损失
        loss = mnist_fcn.loss(logits, labels_pl)

        # 训练网络
        train_op = mnist_fcn.optimizer(loss, learning_rate)

        # 得到一个batch_size中正确分类的图片张数
        eval_correct = mnist_fcn.evaluation(logits, labels_pl)

        # 全局变量初始化,必备操作
        init = tf.global_variables_initializer()

        # 默认图传入Session中
        sess = tf.Session()

        # 初始化模型参数
        sess.run(init)

        for step in range(max_steps):

            # 得到训练数据
            feed_dict = fill_feed_dict(
                data_sets.train, batch_size,
                images_pl, labels_pl
            )

            # 训练网络,得到损失函数值
            _, loss_value = sess.run([train_op, loss],
                                     feed_dict=feed_dict)

            # 每100步输出损失值
            if step % 100 == 0:
                print('step: %d  loss = %.3f' %
                    (step, loss_value))

            # 每1000步在3个数据集上进行评估操作
            # 判断模型是否朝好的方向训练
            if (step + 1) % 1000 == 0 or (step + 1) == max_steps:
                print('Eval on training set')
                do_eval(sess, data_sets.train, batch_size,
                        images_pl, labels_pl, eval_correct)
                print('Eval on validation set')
                do_eval(sess, data_sets.validation, batch_size,
                        images_pl, labels_pl, eval_correct)
                print('Eval on test set')
                do_eval(sess, data_sets.test, batch_size,
                        images_pl, labels_pl, eval_correct)


if __name__ == '__main__':
    # 参数设定
    run_training(data_dir='........',
                 batch_size=100,
                 hidden_units=[200, 400, 100],
                 learning_rate=0.01,
                 max_steps=50000)

数据集及代码下载

点这里!!!!!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基于TensorFlow的MNIST数字识别是一种机器学习技术,它可以通过训练模型来识别数字。MNIST是一个常用的数据集,包含了大量的数字图像和对应的标签。TensorFlow是一个流行的深度学习框架,可以用来构建和训练神经网络模型。通过使用TensorFlow,我们可以构建一个卷积神经网络模型,对MNIST数据集进行训练和测试,从而实现数字识别的功能。 ### 回答2: 随着机器学习技术的不断发展,MNIST数字识别已成为一个基础、常见的图像分类问题。TensorFlow是目前最流行的深度学习框架之一,广泛应用于图像处理、自然语言处理等领域,所以在TensorFlow上实现MNIST数字识别任务是非常具有代表性的。 MNIST数字识别是指从给定的数字图像中识别数字的任务。MNIST数据集是一个由数万张数字图片和相应标签组成的数据集,图片都是28*28像素的灰度图像。每一张图片对应着一个标签,表示图片中所代表的数字。通过对已经标记好的图片和标签进行训练,我们将构建一个模型来预测测试集中未知图片的标签。 在TensorFlow中实现MNIST数字识别任务,可以通过以下步骤完成: 1. 导入MNIST数据集:TensorFlow中的tf.keras.datasets模块内置了MNIST数据集,可以通过如下代码导入:(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() 2. 数据预处理:对数据进行标准化处理,即将灰度值范围从[0,255]缩放到[0,1]之间。同时将标签值进行独热编码,将每个数字的标签由一个整数转换为一个稀疏向量。采用以下代码完成数据预处理:train_images = train_images / 255.0 test_images = test_images / 255.0 train_labels = tf.keras.utils.to_categorical(train_labels, 10) test_labels = tf.keras.utils.to_categorical(test_labels, 10) 3. 构建模型:采用卷积神经网络(CNN)进行建模,包括卷积层、池化层、Dropout层和全连接层。建议采用可重复使用的模型方法tf.keras.Sequential()。具体代码实现为:model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu',input_shape=(28,28,1)), tf.keras.layers.MaxPooling2D((2,2)), tf.keras.layers.Flatten(), tf.keras.layers.Dropout(0.5)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) 4. 编译模型:指定优化器、损失函数和评估指标。可采用Adam优化器,交叉熵损失函数和准确率评估指标。具体实现代码如下:model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 5. 训练模型:采用train()函数进行模型训练,完成代码如下:model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels)) 6. 评估模型:计算测试准确率,完成代码如下:test_loss, test_acc = model.evaluate(test_images, test_labels) print('Test accuracy:', test_acc) 以上就是基于TensorFlow的MNIST数字识别的简要实现过程。其实实现过程还可以更加复杂,比如调节神经元数量,添加卷积层数量等。总之采用TensorFlow框架实现MNIST数字识别是一个可行的任务,未来机器学习发展趋势将越来越向深度学习方向前进。 ### 回答3: MNIST数字识别是计算机视觉领域中最基础的问题,使用TensorFlow实现这一问题可以帮助深入理解神经网络的原理和实现,并为其他计算机视觉任务打下基础。 首先,MNIST数字数据集由28x28像素的灰度图像组成,包含了数字0到9共10个类别。通过导入TensorFlow及相关库,我们可以很容易地加载MNIST数据集并可视化: ``` import tensorflow as tf import matplotlib.pyplot as plt (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data() print("Training images:", train_images.shape) print("Training labels:", train_labels.shape) print("Test images:", test_images.shape) print("Test labels:", test_labels.shape) plt.imshow(train_images[0]) plt.show() ``` 在实现MNIST数字识别的神经网络模型中,最常用的是卷积神经网络(Convolutional Neural Networks,CNN),主要由卷积层、激活层、池化层和全连接层等组成。卷积层主要用于提取局部特征,激活层用于引入非线性性质,池化层则用于加速处理并减少过拟合,全连接层则进行最终的分类。 以下为使用TensorFlow搭建CNN实现MNIST数字识别的代码: ``` model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(28,28,1)), tf.keras.layers.MaxPooling2D(pool_size=(2,2)), tf.keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu'), tf.keras.layers.MaxPooling2D(pool_size=(2,2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(10, activation='softmax') ]) model.summary() model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) train_images = train_images.reshape((60000, 28, 28, 1)) train_images = train_images / 255.0 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images / 255.0 model.fit(train_images, train_labels, epochs=5, batch_size=64) test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) print("Test accuracy:", test_acc) ``` 这段代码中使用了两个卷积层分别提取32和64个特征,池化层进行特征加速和降维,全连接层作为最终分类器输出预测结果。在模型训练时,使用Adam优化器和交叉熵损失函数进行训练,经过5个epoch后可以得到约99%的测试准确率。 总之,通过使用TensorFlow实现MNIST数字识别的经历,可以深切认识到深度学习在计算机视觉领域中的应用,以及如何通过搭建和训练神经网络模型来解决实际问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值