1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| import tensorflow as tf import os from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('/MNIST_data/', one_hot=True) print("Training data size: ", mnist.train.num_examples) print("Validating data size: ", mnist.validation.num_examples) print("Testing data size: ", mnist.test.num_examples) print("Example training data: ", mnist.train.images[0] ) print("Example training data label: ", mnist.train.labels[0])
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 = 30000 MOVING_AVERAGE_DECAY = 0.99 def get_weight_variable(shape, regualrizer): weights = tf.get_variable("weights", shape, initializer=tf.random_normal_initializer(stddev=0.1)) if regualrizer != None: tf.add_to_collection("losses", regualrizer(weights)) return weights def inference(x, regularizer): """ 辅助函数,给定神经网络的输入和所有参数,计算向前传播的结果 定义了一个relu激活的三层全连接网络(输入层,隐藏层,输出层) """ with tf.variable_scope('layer1', reuse = False): 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(x, weights) + biases) with tf.variable_scope('layer2', reuse = False): 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 def train(mnist): """训练模型""" x = tf.placeholder(tf.float32, shape=[None, INPUT_NODE], name="x-input") y_ = tf.placeholder(tf.float32, shape=[None, OUTPUT_NODE], name="y-input") regularizer = tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE) y = inference(x, regularizer) global_step = tf.Variable(0, trainable=False) variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step) variables_averages_op = variable_averages.apply(tf.trainable_variables()) cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(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, staircase = True ) 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(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): xs, ys = mnist.train.next_batch(BATCH_SIZE) sess.run(train_op, feed_dict={x:xs, y_:ys}) if i % 1000 == 0: validate_acc = sess.run(accuracy, feed_dict=validate_feed) print("After %d traing times, validate accuracy using average model is %g" % (i, validate_acc)) test_acc = sess.run(accuracy, feed_dict=test_feed) print("After %d traing times, test accuracy using average model is %g" % (TRAINING_STEPS, test_acc))
def main(argv=None): tf.reset_default_graph() mnist = input_data.read_data_sets('/MNIST_data/', one_hot=True) train(mnist) if __name__ == "__main__": main()
|