您的位置:首页 > 理论基础 > 计算机网络

tensorflow 全连接神经网络 MNIST手写体数字识别

2017-07-25 21:03 671 查看
____tz_zs小练习

案例来源《TensorFlow实战Google深度学习框架》

MNIST手写体数字识别神经网络模型——版本一

# -*- coding: utf-8 -*-
"""
@author: tz_zs(5_2)

MNIST手写体数字识别
"""

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# MNIST 数据集相关的常数
INPUT_NODE = 784 # 输入层为28*28的像素
OUTPUT_NODE = 10 # 输出层0~9有10类

# 配置神经网络的参数
LAYER1_NODE = 500 # 隐藏层节点数

BATCH_SIZE = 100 # batch的大小

LEARNING_RATE_BASE = 0.8 # 基础的学习率
LEARNING_RATE_DECAY = 0.99 # 学习率的衰减率
REGULARIZATION_RATE = 0.0001 # 正则化项的系数
TRAINING_STEPS = 30000 # 训练轮数
MOVING_AVERAGE_DECAY = 0.99 # 滑动平均的衰减率

# 定义神经网络的结构
def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2):
# 当没有提供滑动平均类时,直接使用参数当前的值
if avg_class == None:
# 计算隐藏层的前向传播结果,ReLU激活函数
layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1)
# 计算输出层的前向传播结果(计算损失函数时,会一并进行softmax运输,在这里不进行softmax回归)
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)

# 定义训练模型的操作
def train(mnist):
x = tf.placeholder(tf.float32, [None, INPUT_NODE], name='x-input')
y_ = tf.placeholder(tf.float32, [None, OUTPUT_NODE], name='y-input')

# 生成隐藏层的参数
weights1 = tf.Variable(tf.truncated_normal([INPUT_NODE, LAYER1_NODE], stddev=0.1))
biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE]))

# 生成输出层的参数
weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1))
biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE]))

# 定义计算当前参数下,神经网络前向传播的结果。
y = inference(x, None, weights1, biases1, weights2, biases2)

# 定义存储训练轮数的变量
global_step = tf.Variable(0, trainable=False)

# 初始化滑动平均对象
variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)

# 定义滑动平均的操作
variable_averages_op = variable_averages.apply(tf.trainable_variables())

# 定义计算使用了滑动平均之后的前向传播结果
average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)

# 损失函数
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.argmax(y_, 1), logits=y)
cross_entropy_mean = tf.reduce_mean(cross_entropy)
# L2
regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
regularization = regularizer(weights1) + regularizer(weights2)
loss = cross_entropy_mean + regularization

# 学习率
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, mnist.train.num_examples / BATCH_SIZE,
LEARNING_RATE_DECAY)

# 优化算法
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)

# 训练的操作
with tf.control_dependencies([train_step, variable_averages_op]):
train_op = tf.no_op(name='train')

# 检验 准确度
correct_prediction = tf.equal(tf.argmax(average_y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
tf.global_variables_initializer().run()

# 准备数据
validate_feed = {x: mnist.validation.images, y_: mnist.validation.labels}
test_feed = {x: mnist.test.images, y_: mnist.test.labels}

# 迭代的训练神经网络
for i in range(TRAINING_STEPS):
# 每1000轮,使用验证数据测试一次
if i % 1000 == 0:
validate_acc = sess.run(accuracy, feed_dict=validate_feed)
print("After %d training step(s), validation accuracy "
"using average model is %g " % (i, validate_acc))

# 训练的数据
xs, ys = mnist.train.next_batch(BATCH_SIZE)
sess.run(train_op, feed_dict={x: xs, y_: ys})

# 测试最终的准确率
test_acc = sess.run(accuracy, feed_dict=test_feed)
print("After %d training step(s), test accuracy using average model is %g " % (TRAINING_STEPS, test_acc))

# 主程序入口
def main(argv=None):
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
train(mnist)

if __name__ == '__main__':
tf.app.run()


运行结果:
After 0 training step(s), validation accuracy using average model is 0.1202
After 1000 training step(s), validation accuracy using average model is 0.976
After 2000 training step(s), validation accuracy using average model is 0.9798
After 3000 training step(s), validation accuracy using average model is 0.9824
After 4000 training step(s), validation accuracy using average model is 0.9828
After 5000 training step(s), validation accuracy using average model is 0.9834
After 6000 training step(s), validation accuracy using average model is 0.983
After 7000 training step(s), validation accuracy using average model is 0.9836
After 8000 training step(s), validation accuracy using average model is 0.9838
After 9000 training step(s), validation accuracy using average model is 0.9826
After 10000 training step(s), validation accuracy using average model is 0.985
After 11000 training step(s), validation accuracy using average model is 0.9844
After 12000 training step(s), validation accuracy using average model is 0.9848
After 13000 training step(s), validation accuracy using average model is 0.9844
After 14000 training step(s), validation accuracy using average model is 0.9848
After 15000 training step(s), validation accuracy using average model is 0.9852
After 16000 training step(s), validation accuracy using average model is 0.9854
After 17000 training step(s), validation accuracy using average model is 0.9854
After 18000 training step(s), validation accuracy using average model is 0.9846
After 19000 training step(s), validation accuracy using average model is 0.9852
After 20000 training step(s), validation accuracy using average model is 0.9852
After 21000 training step(s), validation accuracy using average model is 0.9864
After 22000 training step(s), validation accuracy using average model is 0.9852
After 23000 training step(s), validation accuracy using average model is 0.9854
After 24000 training step(s), validation accuracy using average model is 0.9856
After 25000 training step(s), validation accuracy using average model is 0.9862
After 26000 training step(s), validation accuracy using average model is 0.9856
After 27000 training step(s), validation accuracy using average model is 0.986
After 28000 training step(s), validation accuracy using average model is 0.986
After 29000 training step(s), validation accuracy using average model is 0.986
After 30000 training step(s), test accuracy using average model is 0.9843

MNIST手写体数字识别神经网络模型——版本二

mnist_inference.py

# -*- coding: utf-8 -*-
"""
@author: tz_zs

MNIST 升级----mnist_inference.py
"""
import tensorflow as tf

# 定义神经网络结构相关的参数
INPUT_NODE = 784
OUTPUT_NODE = 10
LAYER1_NODE = 500

# 正则化损失
def get_weight_variable(shape, regularizer):
weights = tf.get_variable("weights", shape, initializer=tf.truncated_normal_initialize
4000
r(stddev=0.1))

# 正则化损失
if regularizer != None:
tf.add_to_collection('losses', regularizer(weights))

return weights

# 神经网络的前向传播过程
def inference(input_tensor, regularizer):
# 第一层
with tf.variable_scope('layer1'):
weights = get_weight_variable([INPUT_NODE, LAYER1_NODE], regularizer)
biases = tf.get_variable("biases", [LAYER1_NODE], initializer=tf.constant_initializer(0.0))

layer1 = tf.nn.relu(tf.matmul(input_tensor, weights) + biases)

# 第二层
with tf.variable_scope('layer2'):
weights = get_weight_variable([LAYER1_NODE, OUTPUT_NODE], regularizer)
biases = tf.get_variable("biases", [OUTPUT_NODE], initializer=tf.constant_initializer(0.0))

layer2 = tf.matmul(layer1, weights) + biases

return layer2


mnist_train.py

# -*- coding: utf-8 -*-
"""
@author: tz_zs

MNIST 升级----mnist_train.py
"""
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
# 加载函数
import mnist_inference

# 配置神经网络参数
BATCH_SIZE = 100
LEARNING_RATE_BASE = 0.8
LEARNING_RATE_DECAY = 0.99
REGULARIZATION_RATE = 0.0001
TRAINING_STEPS = 30000
MOVING_AVERAGE_DECAY = 0.99

# 模型保存路径和文件名
MODEL_SAVE_PATH = "/path/to/model/"
MODEL_NAME = "model.ckpt"

def train(mnist):
# 定义输入输出的placeholder
x = tf.placeholder(tf.float32, [None, mnist_inference.INPUT_NODE], name='x-input')
y_ = tf.placeholder(tf.float32, [None, mnist_inference.OUTPUT_NODE], name='y-input')

# 定义正则化
regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)

# 使用前向传播
y = mnist_inference.inference(x, regularizer)

global_step = tf.Variable(0, trainable=False)

# 滑动平均
variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
variable_averages_op = variable_averages.apply(tf.trainable_variables())

# 损失函数
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.arg_max(y_, 1))
cross_entropy_mean = tf.reduce_mean(cross_entropy)
loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))

# 学习率
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE,
global_step,
mnist.train.num_examples / BATCH_SIZE,
LEARNING_RATE_DECAY)
# 优化算法
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
with tf.control_dependencies([train_step, variable_averages_op]):
train_op = tf.no_op(name="train")

# 持久化
saver = tf.train.Saver()
with tf.Session() as sess:
tf.global_variables_initializer().run()
for i in range(TRAINING_STEPS):
xs, ys = mnist.train.next_batch(BATCH_SIZE)
# 运行
_, loss_valuue, step = sess.run([train_op, loss, global_step], feed_dict={x: xs, y_: ys})

# 每1000轮保存一次模型
if i % 1000 == 0:
print("After %d training step(s), loss on training batch is %g." % (step, loss_valuue))
saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)

def main(argv=None):
mnist = input_data.read_data_sets("/tmp/data", one_hot=True)
train(mnist)

if __name__ == '__main__':
tf.app.run()


mnist_eval.py

# -*- coding: utf-8 -*-
"""
@author: tz_zs

测试程序
"""
import time
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

import mnist_inference
import mnist_train

# 每十秒加载一次最新的模型,并在测试数据上测试最新模型的准确率
EVAL_INTERVAL_SECS = 10

def evaluate(mnist):
with tf.Graph().as_default() as g:
x = tf.placeholder(tf.float32, [None, mnist_inference.INPUT_NODE], name="x-input")
y_ = tf.placeholder(tf.float32, [None, mnist_inference.OUTPUT_NODE], name="y-input")

validate_feed = {x: mnist.validation.images, y_: mnist.validation.labels}

# 测试(测试时不用计算正则化损失)
y = mnist_inference.inference(x, None)

# 计算准确率
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 加载模型
variable_averages = tf.train.ExponentialMovingAverage(mnist_train.MOVING_AVERAGE_DECAY)
variables_to_restore = variable_averages.variables_to_restore()
saver = tf.train.Saver(variables_to_restore)
# print(variables_to_restore)
# {'layer2/biases/ExponentialMovingAverage': < tf.Variable
# 'layer2/biases:0'
# shape = (10,)
# dtype = float32_ref >, 'layer2/weights/ExponentialMovingAverage': < tf.Variable
# 'layer2/weights:0'
# shape = (500, 10)
# dtype = float32_ref >, 'layer1/biases/ExponentialMovingAverage': < tf.Variable
# 'layer1/biases:0'
# shape = (500,)
# dtype = float32_ref >, 'layer1/weights/ExponentialMovingAverage': < tf.Variable
# 'layer1/weights:0'
# shape = (784, 500)
# dtype = float32_ref >}

while True:
with tf.Session() as sess:
# 找到文件名
ckpt = tf.train.get_checkpoint_state(mnist_train.MODEL_SAVE_PATH)
if ckpt and ckpt.model_checkpoint_path:
# 加载模型
saver.restore(sess, ckpt.model_checkpoint_path)
# 通过文件名获得模型保存时迭代的轮数
global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]

# 运算出数据
accuracy_score = sess.run(accuracy, feed_dict=validate_feed)

print("After %s training stpe(s), validation accuracy = %g" % (global_step, accuracy_score))
else:
print("No checkpoint file found")
return
time.sleep(EVAL_INTERVAL_SECS)

def main(argv=None):
mnist = input_data.read_data_sets("/tmp/data", one_hot=True)
evaluate(mnist)

if __name__ == '__main__':
tf.app.run()
·
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tensorflow MNIST
相关文章推荐