mnist算是图像识别领域的HelloWorld。也离我发表上一篇博客过去了快一个月的时间了。可以说是比较惭愧的。主要是看了看之前一直从未接触的机器学习的算法。想想还是蛮多的。
在做之前一定要有一个python3+tensorflow的环境。可以参考我上一篇博客。环境搭建
废话不说了,这次的主题是搭建一个mnist的数字识别模型。其中主要内容有以下几部分组成。
1.设置初始参数,比如说输入输出节点个数,初始学习率等等。
2.搭建一个3层全连接的神经模型,里面用了relu去线性化
3.搭建训练模型,里面用了滑动平均模型优化weight和baises;用指数衰减模型优化学习率;通过l2正则化考虑模型复杂度占总损失的比率;
4.调用mnist里的图片。写一个session来调用训练模型
值得一提的是,mnist手写数字的识别我主要参考的是《tensorflow实战谷歌深度学习框架》这本书。里面详细讲了我在第3步中提到的算法。可以说给我提供了很大的帮助。
接下来的代码就是具体的实现过程。如果没有mnist数据集的话,需要科学上网来下载。只要运行程序就可以自动下载了。代码的注释部分主要分析了各个模块的模型的意义。也是我纯手打的,算的上是我学习的成果。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
INPUT_NODE = 784 #输入节点,因为是28*28的像素,所以这里为784个输入节点
OUTPUT_NODE = 10 #输出节点,因为输出是0-9中的一数字。这里指的是一个十分类
LAYER1_NODE = 500 #隐藏层节点数
BATCH_SIZE = 100 #每一个BATCH的大小
LEARNING_RATE_BASE = 0.8 #基础学习率,指数衰减函数有一个要设置基础学习率的地方,接下来随着轮数的上升,学习率逐渐下降
LEARNING_RATE_DECAY = 0.99 #指的是基础学习率的衰减值,每过指定轮数,学习率的0.99次方
REGULARIZATION_RATE = 0.0001#指的是模型复杂度所占损失在总损失中的比例
TRAINING_STEP = 30000 #代表30000张数据图片
MOVING_AVERAGE_DECAY = 0.99 #初始衰减率当求(1+step)/(10+step)与这个MOVING_AVERAGE_DECAY比较取最小值时作比较
'''
这里构建三层全连接神经网络,包括输入层,隐藏层,输出层。考虑了是否使用滑动平均值的两种情况。
当不使用时,weight和biases一直是一个定值不会发生变化。
当有avg_class输入时,下面对应的variable_averages_op是随着训练轮数增加不断变化的一个变量
avg_class.average()相当于在求括号内的数经过很多轮次后的平均值
因为 tf.trainable_variables()会自动训练trainable不是False的Variable变量
'''
def inference(input_tensor, avg_class, weights1, biases1, weights2,