TF-day3 mnist识别数字

来源:互联网 发布:lol韩服账号淘宝 编辑:程序博客网 时间:2024/06/03 21:07

相对TF-day1中mnist数字识别的神经网络,这次的神经网络结构更复杂. 使用了带指数衰减的学习率设置,使用正则化来避免过度拟合,以及使用滑动平均模型來使得模型更加健壮.

# coding: utf-8from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tf###get datasetmnist = input_data.read_data_sets("MNIST_data/", one_hot=True)# mnist数据集的相关常数INPUT_NODE = 784  ###特征个数,像素pixelOUTPUT_NODE = 10  ###输出的类别 0~9LAYER1_NODE = 500  ###hidden layer nodesBATCH_SIZE = 100  ##一个训练batch中的训练数据个数LEARNING_RATE_BASE = 0.8LEARNING_RATE_DECAY = 0.99REGULARIZATION_RATE = 0.001TRAINING_STEPS = 30000MOVING_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)        output_layer = tf.matmul(layer1, weights2) + biases2        return output_layer    else:        layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1)) + avg_class.average(biases1))        output_layer = tf.matmul(layer1, avg_class.average(weights2)) + avg_class.average(biases2)        return output_layerdef train(mnist):    ##输入值y_ 表示真实值    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)    ##在所有的神经网络参数的变量上使用滑动平均,但其他辅助变量就不用了    ##tf.trainable_variables返回的就是图上Graphkeys.TRAINABLE_VARIABLES中的元素。这个集合中的元素就是没有指定trainable=False的参数    variables_averages_op = variable_averages.apply(tf.trainable_variables())    ##""Returns all variables created with `trainable=True`.    ##使用了滑动平均之后的前向传播结果。    average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)    ##交叉熵,第一个参数是神经网络未经过softmax层的结果,第二个参数是真实值。????    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.argmax(y_, 1), logits=y)    ##计算当前batch中所有样例的交叉熵平均值    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, variables_averages_op]):        train_op = tf.no_op(name='train')    correct_prediction = tf.equal(tf.argmax(average_y, 1), tf.argmax(y_, 1))    ##Casts a tensor to a new type.True->1,False->0    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 steps,validation accuracy using average model is %g" % (                i, validate_acc))  ##graph            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 steps,test accuracy using average model is %g" % (TRAINING_STEPS, test_acc))def main(argv=None):    train(mnist)if __name__ == '__main__':    tf.app.run()

结果:

after 0 training steps,validation accuracy using average model is 0.0722after 1000 training steps,validation accuracy using average model is 0.9732after 2000 training steps,validation accuracy using average model is 0.9786after 3000 training steps,validation accuracy using average model is 0.9784after 4000 training steps,validation accuracy using average model is 0.9796after 5000 training steps,validation accuracy using average model is 0.9792after 6000 training steps,validation accuracy using average model is 0.9794after 7000 training steps,validation accuracy using average model is 0.9796after 8000 training steps,validation accuracy using average model is 0.9806after 9000 training steps,validation accuracy using average model is 0.9802after 10000 training steps,validation accuracy using average model is 0.9814after 11000 training steps,validation accuracy using average model is 0.9804after 12000 training steps,validation accuracy using average model is 0.9798after 13000 training steps,validation accuracy using average model is 0.9808after 14000 training steps,validation accuracy using average model is 0.9812after 15000 training steps,validation accuracy using average model is 0.9798after 16000 training steps,validation accuracy using average model is 0.9804after 17000 training steps,validation accuracy using average model is 0.9808after 18000 training steps,validation accuracy using average model is 0.981after 19000 training steps,validation accuracy using average model is 0.9806after 20000 training steps,validation accuracy using average model is 0.98after 21000 training steps,validation accuracy using average model is 0.9816after 22000 training steps,validation accuracy using average model is 0.981after 23000 training steps,validation accuracy using average model is 0.981after 24000 training steps,validation accuracy using average model is 0.9814after 25000 training steps,validation accuracy using average model is 0.9816after 26000 training steps,validation accuracy using average model is 0.9812after 27000 training steps,validation accuracy using average model is 0.9816after 28000 training steps,validation accuracy using average model is 0.9822after 29000 training steps,validation accuracy using average model is 0.9818after 30000 training steps,test accuracy using average model is 0.981
原创粉丝点击