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

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

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

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第3张图片北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第4张图片 

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

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第6张图片 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第7张图片

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

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

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第10张图片 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第11张图片

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

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

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

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

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第16张图片 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第17张图片

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第18张图片 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第19张图片

北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第20张图片 北京大学曹健——Tensorflow笔记 05 MNIST数据集输出手写数字识别准确率_第21张图片

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

# 前向传播:描述了网络结构  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()

 

你可能感兴趣的:(Machine,Learning)