北京大学曹健——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()