MNIST 手写数字识别(一)

本文介绍了使用TensorFlow处理MNIST数据集,建立了一个简单的逻辑回归模型,并详细讲解了Softmax回归和交叉熵在模型训练中的作用。通过Softmax将模型输出转换为概率分布,利用交叉熵作为损失函数,最终模型在识别任务上的准确率稳定在约92%。
摘要由CSDN通过智能技术生成

MNIST 手写数字识别模型建立与优化

本篇的主要内容有:

  • TensorFlow 处理MNIST数据集的基本操作
  • 建立一个基础的识别模型
  • 介绍 S o f t m a x Softmax Softmax回归以及交叉熵等

MNIST是一个很有名的手写数字识别数据集(基本可以算是“Hello World”级别的了吧),我们要了解的情况是,对于每张图片,存储的方式是一个 28 * 28 的矩阵,但是我们在导入数据进行使用的时候会自动展平成 1 * 784(28 * 28)的向量,这在TensorFlow导入很方便,在使用命令下载数据之后,可以看到有四个数据集:
在这里插入图片描述

模型

来看一个最基础的模型建立,首先了解TensoFlow对MNIST数据集的一些操作

1.TensorFlow 对MNIST数据集的操作

下载、导入

from tensorflow.examples.tutorials.mnist import input_data
# 第一次运行会自动下载到代码所在的路径下

mnist = input_data.read_data_sets('location', one_hot=True)
# location 是保存的文件夹的名称

打印MNIST数据集的一些信息,通过这些我们就可以知道这些数据大致如何使用了

# 打印 mnist 的一些信息

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

print("type of 'mnist is %s'" % (type(mnist)))
print("number of train data is %d" % mnist.train.num_examples)
print("number of test data is %d" % mnist.test.num_examples)

# 将所有的数据加载为这样的四个数组 方便之后的使用
trainimg = mnist.train.images
trainlabel = mnist.train.labels
testimg = mnist.test.images
testlabel = mnist.test.labels

print("Type of training is %s" % (type(trainimg)))
print("Type of trainlabel is %s" % (type(trainlabel)))
print("Type of testing is %s" % (type(testimg)))
print("Type of testing is %s" % (type(testlabel)))

输出结果:

type of 'mnist is <class 'tensorflow.contrib.learn.python.learn.datasets.base.Datasets'>'
number of train data is 55000    # 训练集共有55000条数据
number of test data is 10000     # 训练集有10000条数据
Type of training is <class 'numpy.ndarray'>    # 四个都是Numpy数组的类型
Type of trainlabel is <class 'numpy.ndarray'>
Type of testing is <class 'numpy.ndarray'>
Type of testing is <class 'numpy.ndarray'>

如果我们想看一看每条数据保存的图片是什么样子,可以使用 matplot()函数

# 接上面的代码

nsmaple = 5
randidx = np.random.randint(trainimg.shape[0], size=nsmaple)

for i in randidx:
    curr_img = np.reshape(trainimg[i,:], (28, 28))  # 数据中保存的是 1*784 先reshape 成 28*28
    curr_label = np.argmax(trainlabel[i, :])
    plt.matshow(curr_img, cmap=plt.get_cmap('gray'))
    plt.show()

通过上面的代码可以看出数据集中的一些特点,下面建立一个简单的模型来识别这些数字。

2.简单逻辑回归模型建立

显然,这是一个逻辑回归(分类)的问题,首先来建立一个最简单的模型,之后会逐渐地优化。分类模型一般会采用交叉熵方式作为损失函数,所以,对于这个模型的输出,首先使用 S o f t m a x Softmax Softmax 回归方式处理为概率分布,然后采用交叉熵作为损失函数,使用梯度下降的方式进行优化。

需要注意的地方直接卸载代码注释中了,只要根据这个过程走一遍,其实就很好理解了。(其实代码并不长,只是注释写的多,都记下来,防止以后忘了没处看 =_=||| )。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 读入数据  ‘MNIST_data’ 是我保存数据的文件夹的名称
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# 各种图片数据以及标签 images是图像数据  labels 是正确的结果
trainimg = mnist.train.images
trainlabels = mnist.train.labels
testimg = mnist.test.images
testlabels = mnist.test.labels

# 输入的数据 每张图片的大小是 28 * 28,在提供的数据集中已经被展平乘了 1 * 784(28 * 28)的向量
# 方便矩阵乘法处理
x = tf.placeholder(tf.float32, [None, 784])
# 输出的结果是对于每一张图输出的是 1*10 的向量,例如 [1, 0, 0, 0...]
# 只有一个数字是1 所在的索引表示预测数据
y = tf.placeholder(tf.float32, [None, 10])

# 模型参数
# 对于这样的全连接方式 某一层的参数矩阵的行数是输入数据的数量 ,列数是这一层的神经元个数
# 这一点用线性代数的思想考虑会比较好理解
W = tf.Variable(tf.zeros([784, 10]))
# 偏置
b = tf.Variable(tf.zeros([10]))

# 建立模型 并使用softmax()函数对输出的数据进行处理
# softmax() 函数比较重要 后面写
# 这里注意理解一下 模型输出的actv的shape 后边会有用(n * 10, n时输入的数据的数量)
actv = tf.nn.softmax(tf.matmul(x, W) + b)

# 损失函数 使用交叉熵的方式  softmax()函数与交叉熵一般都会结合使用
# clip_by_value()函数可以将数组整理在一个范围内,后面会具体解释
cost = tf.reduce_mean(-tf.reduce_sum(y * tf.log(tf.clip_by_value(actv, 1e-10, 1.0)), reduction_indices=1))

# 使用梯度下降的方法进行参数优化
learning_rate = 0.01
optm = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# 判断是否预测结果与正确结
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值