第五章 MNIST数字识别问题
5.1 MNIST数据处理
MNIST数据集简介
MNIST数据集是NIST数据集的一个子集,是一个手写体数字识别数据集
它包含60000张图片作为训练数据,10000张图片作为测试数据
在MNIST数据集中的每一张图片都代表了0~9中的一个数字,图片的大小都是28*28,且数字都出现在图片的正中间
如图所示,一张数字图片及和它对应的像素矩阵
为了验证模型训练的效果,一般还需要从训练数据中划分出一部分数据作为验证数据
TensorFlow中的封装(基本过时)
样例程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
from tensorflow.examples.tutorials.mnist import input_data # 载入MNIST数据集,如果指定地址/path/to/MNIST_data下没有已经下载好的数据 # 那么TensorFlow会自动下载数据 mnist = input_data.read_data_sets("/path/to/MNIST_data/", one_hot=True) # 打印训练集的数据量 print("Training data size:", mnist.train.num_examples) # 打印验证集的数据量 print("Validating data size:", mnist.validation.num_examples) # 打印测试集的数据量 print("Testing data size:", mnist.test.num_examples) # 打印训练集中某一样例数据 # 一张数字图片,它的每个像素点都被放到这个长度为128一维数组中 # 如果一个像素点越接近于1,则颜色越深;越接近于0,则颜色越浅 print("Example training data:", mnist.train.images[0]) # 打印训练集中某一样例数据的标记 # 一个大小为10的一维数组 # 数组中其中一个数字取值为1,其余数字取值为0 print("Example training data label:", mnist.train.labels[0]) # 设置batch的大小 batch_size = 100 # 使用next_batch()方法来获得下一个batch的输入数据 xs, ys = mnist.train.next_batch(batch_size) print("X shape:", xs.shape) print("Y shape", ys.shape)
解读
MNIST数据集被划分为train、validation和test三个数据集
处理后的每一张图片都是一个长度为784的一维数组,因为神经网络的输入是一个特征向量,所以在此把一张二维图像的像素矩阵放到一个一维数组中可以方便TensorFlow将图片的像素矩阵提供给神经网络的输入层
像素矩阵中元素的取值范围为[0,1],它代表了颜色的深浅
使用mnist.train.next_batch()可以从所有的训练数据中读取一小部分作为一个batch
5.2 神经网络模型训练及不同模型结果对比
5.2.1 TensorFlow训练神经网络
回顾主要概念
- 在神经网络的结构上,深度学习一方面需要使用激活函数实现神经网络模型的去线性化,另一方面需要使用一个或多个隐藏层使得神经网络的结构更深,以解决复杂问题
- 使用带指数衰减的学习率设置、使用正则化来避免过度拟合,以及使用滑动平均模型可以使得神经网络模型更加健壮
直接给出代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # MNIST数据集相关参数 INPUT_NODE = 784 # 输入层的节点数,等于图片的像素 OUTPUT_NODE = 10 # 输出层的节点数,等于类别的数目。0-9这10个数字,所以是10 # 配置神经网络的参数 LAYER1_NODE = 500 # 隐藏层节点数,这里只有一个隐藏层,此隐藏层有500个节点 BATCH_NODE = 100 # batch的大小 LEARNING_RATE_BASE = 0.8 # 基础的学习率 LEARNING_RATE_DECAY = 0.99 # 学习率的衰减率 REGULARIZATION_RATE = 0.0001 # 正则化项在损失函数中的系数 TRAINING_STEPS = 30000 # 训练轮数 MOVING_AVERAGE_DECAY = 0.99 # 滑动平均衰减率 # 给定神经网络的输入和所有参数,计算神经网络的前向传播结果 # 在这里定义了一个使用ReLU激活函数的三层全连接网络 # 通过一层隐藏层实现了多层网络结构 # 通过ReLU激活函数实现了去线性化 # 并且提供了对滑动平均模型的支持,此时需要传入avg_class def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2): if avg_class is None: layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1) return tf.matmul(layer1, weights2) + biases2 else: layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1)) + avg_class.average(biases1)) return tf.matmul(layer1, avg_class.average(weights2)) + avg_class.average(biases2) # 训练模型的整个