MNIST手写字识别的TensorFlow实现

来源:互联网 发布:linux tail命令 编辑:程序博客网 时间:2024/04/30 21:54

1. 简介

       本文介绍的是MNIST手写字体CNN识别模型的TensorFlow的实现。据本人亲自测试,当迭代训练次数为20000时能在验证集上取得最高的准确率。当迭代训练次数达到28000次之后,模型识别准确率骤降,至于原因本人后续研究解释。

2. 完整源码实现

from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tf# 导入数据集mnist = input_data.read_data_sets("MNIST_data", one_hot=True)sess = tf.InteractiveSession()# 权重和初始化创建函数def weight_variable(shape):    initial = tf.truncated_normal(shape, stddev=0.1)    return tf.Variable(initial)def bias_variable(shape):    initial = tf.constant(0.1, shape=shape)    return tf.Variable(initial)def conv2d(x, W):    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')def max_pool_2x2(x):    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')# 定义输入的特征x和真实类标y_x = tf.placeholder(tf.float32, [None, 784])y_ = tf.placeholder(tf.float32, [None, 10])x_image = tf.reshape(x, [-1, 28, 28, 1])# 定义第一层卷积层W_conv1 = weight_variable([5, 5, 1, 32])b_conv1 = bias_variable([32])h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)h_pool1 = max_pool_2x2(h_conv1)# 定义第二层卷积层W_conv2 = weight_variable([5, 5, 32, 64])b_conv2 = bias_variable([64])h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)h_pool2 = max_pool_2x2(h_conv2)# 定义全连接层W_fc1 = weight_variable([7 * 7 * 64, 1024])b_fc1 = bias_variable([1024])h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)# Dropout层,防止过拟合keep_prob = tf.placeholder(tf.float32)h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)# Dropout输出连接Softmax层,得到最后的输出概率W_fc2 = weight_variable([1024, 10])b_fc2 = bias_variable([10])y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)# 定义损失函数,优化器使用Adamcross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)# 评估准确率correct_prediction = tf.equal(tf.arg_max(y_conv, 1), tf.arg_max(y_, 1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# 初始化所有参数,开始训练tf.global_variables_initializer().run()for i in range(20000):    batch = mnist.train.next_batch(50)    if i % 100 == 0:        train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})        print("step %d, training accuracy %g" % (i, train_accuracy))    train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})# 测试集上的准确率print("test accuracy %.2f%%" % (100 * accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})))

3. 输出结果

...step 18300, training accuracy 1step 18400, training accuracy 1step 18500, training accuracy 1step 18600, training accuracy 1step 18700, training accuracy 1step 18800, training accuracy 1step 18900, training accuracy 1step 19000, training accuracy 1step 19100, training accuracy 1step 19200, training accuracy 1step 19300, training accuracy 1step 19400, training accuracy 1step 19500, training accuracy 1step 19600, training accuracy 1step 19700, training accuracy 1step 19800, training accuracy 1step 19900, training accuracy 1test accuracy 99.20%
4 0
原创粉丝点击