北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率 

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率

# 前向传播:描述了网络结构  minist_forward.py
# 反向传播:描述了模型参数的优化方法  mnist_backward.py
# 测试输出准确率minist_test.py

import tensorflow as tf

# 首先定义神经网络的相关参数
INPUT_NODE = 784   #神经网络输入节点是784个,因为输入是图片像素值,每张图片28*28,共784像素点,每个像素点是0~1之间的浮点数,这784个点组成一个一维数组
OUTPUT_NODE = 10   #输出10个数,每个数表示对应的索引号出现的概率,实现了十分类
LAYER1_NODE = 500  # 定义了隐藏层的节点个数

def get_weight(shape, regularizer):
    w = tf.Variable(tf.truncated_normal(shape, stddev = 0.1))  #更透过tf.Vwariable,在训练神经网络时,随机生成参数w
    if regularizer != None:  #如果使用正则化,则将每个变量的损失加入到总损失losses
        tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))
    return w

def get_bias(shape):
    b = tf.Variable(tf.zeros(shape))
    return b

def forward(x,regularizer):  #搭建神经网络,描述从输入到输出的数据流
    w1 = get_weight([INPUT_NODE,LAYER1_NODE],regularizer)
    b1 = get_bias([LAYER1_NODE])
    y1 = tf.nn.relu(tf.matmul(x,w1) + b1)  #第一层参数w1/b1/y1

    w2 = get_weight([LAYER1_NODE,OUTUT_NODE],regularizer)
    b1 = get_bias([OUTPUT_NODE])
    y = tf.matmul(y1,w2) + b2   #第二层参数w1/b2/y y直接输出
    return y   #因为要对输出使用softmax函数,使它符合概率分布,所以输出y不过value函数
# 前向传播:描述了网络结构  minist_forward.py
# 反向传播:描述了模型参数的优化方法  mnist_backward.py
# 测试输出准确率minist_test.py

import tensorflow as tf
from tensorflow.examples.tutorials.minist import input_date
import minist_forward
import os

# 首先定义神经网络的相关参数
BATCH_SIZE = 200              # 定义每轮喂入神经网络多少张图片
LEARNING_RATE_BASE = 0.1      # 学习率
LEARNING_RATE_DECAY = 0.99    # 衰减率
REGULARIZER = 0.0001          # 正则化系数
STEPS = 50000                 # 训练50000轮
MOVING_AVERAGE_DECAY = 0.99   # 滑动平均衰减率
MODEL_SAVE_PATH = "./model"   # 模型保存路径
MODEL_NAME = "mnist_model"    # 模型保存文件名

def backward(mnist):          # backward函数中读入mnist
    x = tf.placeholder(tf.float32,[None,mnist_forward.INPUT_NODE])      # 用placeholder给x占位
    y_ = tf.placeholder(tf.float32, [None, mnist_forward.OUTPUT_NODE])  # 用placeholder给y_占位
    y = minist_forward.forward(x,REGULARIZER)                           # 用前向传播函数计算输出y
    global_step = tf.Variable(0,trainable=False)     # 给轮数计数器global_step赋初值,定义为不可训练

    ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = y,labels = tf.arg_max(y_,1))
    cem = tf.reduce_mean(ce)
    loss = cem + tf.add_n(tf.get_collection('losses'))    # 调用包含正则化的损失函数loss

    learning_rate = tf.train.exponential_decay(    # 定义指数衰减学习率
        LEARNING_RATE_BASE,
        global_step,
        mnist.train.num_examples / BATCH_SIZE,
        LEARNING_RATE_DECAY,
        staircase=True
    )

    train_step = tf.train.ProximalGradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)

    ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
    ema_op = ema.apply(tf.trainable_variables())
    with tf.control_dependencies([train_step,ema_op]):
        train_op = tf.no_op(name = 'train')

    saver = tf.train.Saver()  # 实例化Saver

    with tf.Session as sess:        # 在with结构中初始化所有变量
        init_op = tf.gloabal_variables_initiator()
        sess.run(init_op)
        for i in range(STEPS):     # 用for循环迭代steps轮
            xs,ys = mnist.train.next_batch(BATCH_SIZE) # 每次读入BATCH_SIZE图片和标签,喂入神经网络进行训练
            _,loss_value,step = sess.run([train_op,loss,global_step],feed_dict={x:xs,y_:ys}) # 必须执行sess.run才能得到模型结果
            if i % 1000 == 0:
                print("After %d training steps, loss on training batch is %g"%(step,loss_value))
                saver.save(sess,os.path.join(MODEL_SAVE_PATH,MODEL_NAME,global_step=global_step))

def main():
    mnist = input_date.read_data_sets("./data/",one_hot=True)
    backward(mnist)

if __name__ == __main__:
    main()