Ubuntu 下Tensorflow 中手写体数字识别MNIST数据集完整程序

不多说,直接上代码
欢迎大家指出错误。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#常数
INPUT_NODE=784
OUTPUT_NODE=10
#神经网络参数
LAYER1_NODE=500    			          #隐藏节点数
BATCH_SIZE=100					 		  #一个训练中的个数
LEARNING_RATE_BASE=0.8  		  #基础学习率
LEARNING_RATE_DECAY=0.99       #学习衰减率
REGULARIZATION_RATE=0.0001   #正则化在损失函数系数
TRAINING_STEPS=3000 				 #训练轮数
MOVING_AVERAGE_DECAY=0.99  #滑动平均衰减率


#辅助函数,实现前向传播  通过ReLU函数去线性化
def inference(input_tensor,avg_class,weights1,biases1,weight2,biases2):
	if avg_class==None:
		layer1=tf.nn.relu(tf.matmul(input_tensor,weight1)+biases1)
		return tf.matmul(layer1,weights2)+biases2
	else:
		layer1=tf.nn.relu(tf.matmul(input_tensor,avg_class.average(weight1))+avg_class.average(biases1))
		return tf.matmul(layer1,avg_class.average(weight2))+avg_class.average(biases2)
	
#训练模型过程
def train(mnist):
	x=tf.placeholder(tf.flaot32,[NODE,INPUT_NODE],name='x-input')
	y_=tf.placeholder(tf.flaot32,[NODE,OUTPUT_NODE],name='y-input')
	#生成隐藏层的参数
	weights1=tf.Variable(tf.truncated_normal([INPUT_NODE,LAYER1_NODE],seddev=0.1))
	biases1=tf.Variable(tf.constant(0.1,shape=[LAYER1_NODE]))
	#生成输出层的参数
	weights2=tf.Variable(tf.truncated_normal([LAYER_NODE,OUTPUT_NODE],seddev=0.1))
	biases2=tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))

	#计算在当前参数下神经网络前向传播的结果
	y=inference(x,None,weight1,biases1,weight2,biases2)

	#定义存储训练轮数的变量  这里指定不可训练的变量(trainable=False)
	global_step=tf.Variable(0,trainable=False)
	
	#给定滑动平均衰减率和训练轮数的变量,初始化参数
	varibale_averages=tf.train.ExponentiaMovingAverage(MOVING_AVERAGE_DECAY,global_step)
	#返回一个图上集合
	variavles_average_op=variable_averages.apply(tf.trainalbe_variables())
	#滑动平均的前向传播结果
	average_y=inference(x,variable_average,weights1,biases1,weights2,biases2)
	
	#计算交叉熵,预测损失函数
	cross_entropy=tf.nn.sparse_softmax_cross_entrepy_with_logits(logits=y,labels=tf.argmax(y_,1))

	#计算当前batch中所以样例的交叉熵平均值
	cross_entropy_mean=tf.reduce_mean(cross_entropy)

	#计算L2正则化损失函数
	regularizer=tf.contrib.layers.12_regularizer(REGULARIZATION_RATE)
	#计算总的正则化损失。
	regularization=regularizer(weights1)+regularizer(weights2)
	#总损失
	loss=cross_entropy_mean+regularization
	#设置衰减学习率
	learning_rate=tf.train.exponential_decay(
				LEARNING_RATE_BASE,globla_step,mnist.train.num_examples/BATCH_SIZE,LEARNING_RATE_DECAY)
#梯度下降来优化损失函数
train_step=tf.train.GradientDescentOptimizer(learning_rate)\
						.minimize(loss,globla_step=globla_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.globla_variables_initializer().run()
	#准备验证数据
	validate_feed={
    
    x:mnist.validation.imaage2,y_:mnist.validation.lables}
	#准备测试数据
	test_feed={
    
    x:mnist.test.images,y_:mnist.test.lables}
	#迭代训练神经网络
	for i in range(TRANING_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))
		#产生这一轮一个batch的训练数据
		xs,ys=mnist.train.next_batch(BAtCH_SEZE)
		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()	

	
	``
**以上内容均摘自《tensorflow深度学习框架》*×

猜你喜欢

转载自blog.csdn.net/qq_43570528/article/details/96473069
今日推荐