不多说,直接上代码
欢迎大家指出错误。
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深度学习框架》*×