MNIST 数据集介绍
- mnist 数据集:包含 7 万张黑底白字手写数字图片,其中 55000 张为训练集,5000 张为验证集,10000 张为测试集。
每张图片大小为 28*28 像素,图片中纯黑色像素值为 0,纯白色像素值为 1。
数据集的标签是长度为 10 的一维数组,数组中每个元素索引号表示对应数字出现的概率。
在将 mnist 数据集作为输入喂入神经网络时,需先将数据集中每张图片变为长度784 一维数组,将该数组作为神经网络输入特征喂入神经网络。
例如: 一张数字手写体图片变成长度为 784 的一维数组[0. 0. 0. 0. 0.231 0.235 0.459……0.219 0. 0. 0. 0.]输入神经网络。该图片对应的标签为[0. 0. 0. 0. 0. 0. 1. 0. 0. 0],标签中索引号为 6 的元素为 1,表示是数字 6 出现的概率为 100%,则该图片对应的识别结果是 6。 tensorflow中对mnist数据集的操作
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('./data/', one_hot=True) print('1. train data size', mnist.train.num_examples) print('2. validation data size', mnist.validation.num_examples) print('3. test data size', mnist.test.num_examples) print('4. train.labels[0]\n', mnist.train.labels[0]) print('5. train.images[0]\n', mnist.train.images[0]) BATCH_SIZE = 200 xs, ys = mnist.train.next_batch(BATCH_SIZE) print('6. xs.shape: ', xs.shape) print('7. ys.shape: ', ys.shape)
输出:
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes. Extracting ./data/train-images-idx3-ubyte.gz Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes. Extracting ./data/train-labels-idx1-ubyte.gz Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes. Extracting ./data/t10k-images-idx3-ubyte.gz Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes. Extracting ./data/t10k-labels-idx1-ubyte.gz 1. train data size 55000 2. validation data size 5000 3. test data size 10000 4. train.labels[0] [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.] 5. train.images[0] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ...... 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.3803922 0.37647063 0.3019608 0.46274513 0.2392157 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.3529412 0.5411765 0.9215687 0.9215687 0.9215687 0.9215687 0.9215687 ...... 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] 6. xs.shape: (200, 784) 7. ys.shape: (200, 10)
实现“Mnist 数据集手写数字识别”的常用函数:
- tf.get_collection(“”)函数表示从 collection 集合中取出全部变量生成一个列表。
- tf.cast(x,dtype)函数表示将参数 x 转换为指定数据类型。
- tf.equal( )函数表示对比两个矩阵或者向量的元素。若对应元素相等,则返回 True;若对应元素不相等,则返回False。
- tf.reduce_mean(x,axis)函数表示求取矩阵或张量指定维度的平均值。若不指定第二个参数,则在所有元素中取平均值;若指定第二个参数为 0,则在第一维元素上取平均值,即每一列求平均值;若指定第二个参数为 1,则在第二维元素上取平均值,即每一行求平均值。
tf.Graph( ).as_default( )函数表示将当前图设置成为默认图,并返回一个上下文管理器。该函数一般与 with 关键字搭配使用,应用于将已经定义好的神经网络在计算图中复现。
例如:with tf.Graph().as_default() as g:
表示将在 Graph()内定义的节点加入到计算图 g 中。
模型的保存和加载
神经网络模型的保存:在反向传播过程中,一般会间隔一定轮数保存一次神经网络模型,并产生三个文件(保存当前图结构的.meta 文件、保存当前参数名的.index 文件、保存当前参数的.data 文件)。在 Tensorflow 中如下表示:
saver = tf.train.Saver() with tf.Session() as sess: for i in range(STEPS): if i % 轮数 == 0: saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)
其中,tf.train.Saver()用来实例化 saver 对象。上述代码表示,神经网络每循环规定的轮数,将神经网络模型中所有的参数等信息保存到指定的路径中,并在存放网络模型的文件夹名称中注明保存模型时的训练轮数。
神经网络模型的加载:在测试网络效果时,需要将训练好的神经网络模型加载,在 Tensorflow 中这样表示:
with tf.Session() as sess: ckpt = tf.train.get_checkpoint_state(存储路径) if ckpt and ckpt.model_checkpoint_path: saver.restore(sess, ckpt.model_checkpoint_path)
在 with 结构中进行加载保存的神经网络模型,若 ckpt 和保存的模型在指定路径中存在,则将保存的神经网络模型加载到当前会话中。
加载模型中参数的滑动平均值,在保存模型时,若模型中采用滑动平均,则参数的滑动平均值会保存在相应文件中。通过实例化 saver 对象,实现参数滑动平均值的加载,在 Tensorflow 中如下表示:
ema = tf.train.ExponentialMovingAverage(滑动平均基数) ema_restore = ema.variables_to_restore() saver = tf.train.Saver(ema_restore)
神经网络模型准确率评估方法:在网络评估时,一般通过计算在一组数据上的识别准确率,评估神经网络的效果。在 Tensorflow 中这样表示:
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))