参照《TensorFlow实战》实现,加上自己的理解
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 载入数据集,使用one-hot编码
mnist = input_data.read_data_sets("/path/to/MNIST_data",one_hot=True)
#参数配置
INPUT_NODE = 784 # 输入层:图片像素
OUTPUT_NODE = 10 # 输出层:0-9
LAYER1_NODE = 500 # 隐藏层
BATCH_SIZE = 100 # 批尺寸
LEARNING_RATE_BASE = 0.8 # 学习率
LEARNING_RATE_DECAY = 0.99 # 学习率的衰减速率
REGULARIZATION_RATE = 0.0001 # 正则化项系数
TRAINING_STEPS = 10000 # 训练轮数
MOVING_AVERAGE_DECAY = 0.99 # 滑动平均衰减率
# 前向传播计算函数
def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2):
# 有无滑动平均(传递函数)
if avg_class == None:
layer1=tf.nn.relu(tf.matmul(input_tensor,weights1)+biases1)
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(懒惰计算)
x = tf.placeholder(tf.float32,[None,INPUT_NODE],name="x-input")
# 读入Y_
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]))
# 训练轮数
global_step = tf.Variable(0, trainable=False)
# 滑动平均类
variable_averges = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
# 对所有trainable变量使用滑动平均
variable_averges_op = variable_averges.apply(tf.trainable_variables())
# 计算前向传播(不用滑动评价)
y = inference(x, None, weights1, biases1, weights2, biases2)
# 计算前向传播(滑动平均)
average_y = inference(x, variable_averges, weights1, biases1, weights2, biases2)
# 交叉熵
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
# 计算当前batch中所有样例的交叉熵平均值
cross_entropy_mean = tf.reduce_mean(cross_entropy)
# 正则化项
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,
staircase=True
)
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
# 合并操作
with tf.control_dependencies([train_step,variable_averges_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):
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()