Tensorflow学习-MNIST识别-两层卷积 发表于 2018-09-18 | 分类于 CS | | 阅读数 次 字数统计: 1.1k | 阅读时长 ≈ 5 在之前的基础上,尝试卷积,效果很好 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170#导入Tensorflow库import tensorflow as tf#导入MNIST数据样例库from tensorflow.examples.tutorials.mnist import input_data#导入Tensorboard用于显示训练过程import tensorboard#从MNIST数据库中读取数据mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)#定义输入输出的维度,使用占位符并定义矩阵格式x = tf.placeholder(tf.float32,[None,784])y_ = tf.placeholder(tf.float32,[None,10])#使用reshape将原始的数据进行转换,使784维向量成为28*28*1的矩阵图片x_image = tf.reshape(x,[-1,28,28,1])#试输出转换后的数据形式x_imageOUT:<tf.Tensor 'Reshape:0' shape=(?, 28, 28, 1) dtype=float32>#定义权重层,shape为权重层数据的格式,n为当前层数def weight_variable(shape,n): with tf.name_scope('weight_variable_%s' % n): #通过tf.truncated_normal来初始化权重 #该方法使用2倍的stddev来截断正态分布,选取随机值 initial = tf.truncated_normal(shape,stddev=0.1) return tf.Variable(initial)#定义偏置层,shape为偏置的格式,n为当前层数def bias_variable(shape,n): with tf.name_scope('bias_variable_%s' % n): #通过定义常数张量初始化偏置 initial = tf.constant(0.1,shape=shape) return tf.Variable(initial)#卷积层,x为输入矩阵,w为卷积的核def conv2d(x,w,n): with tf.name_scope('Convolution_layer_%s' % n): #strides为步长,padding选择SAME return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')#池化层,x为输入矩阵,n为当前层数def maxpool_2x2(x,n): with tf.name_scope('pooling_%s' % n): #ksize池化窗口大小, #strides窗口每个维度的滑动步长 return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')#定义第一层的权重、偏置W_conv1 = weight_variable([5,5,1,32],1)b_conv1 = bias_variable([32],1)#进行第一层的卷积h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1,1) + b_conv1)#对第一层卷积的结果进行池化h_pool1 = maxpool_2x2(h_conv1,1)#定义第二层的权重、偏置W_conv2 = weight_variable([5, 5, 32, 64],2)b_conv2 = bias_variable([64],2).#进行第二层的卷积h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2,2) + b_conv2)#对第二层卷积的结果进行池化h_pool2 = maxpool_2x2(h_conv2,2)#两次的卷积由于padding,都没有缩小维数,#但是pooling的时候,每次都缩小了2倍,则最后28/2/2=7,维数为7*7,通道为64W_fc1 = weight_variable([7 * 7 * 64,1024],'fc1')b_fc1 = bias_variable([1024],'fc1')#又将7*7*64的图片格式,转化为7*7*64维的向量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)#最后全连接层,准备输出W_fc2 = weight_variable([1024,10],'fc2')b_fc2 = bias_variable([10],'fc2')#输出预测层y_conv = tf.matmul(h_fc1_drop,W_fc2) + b_fc2#定义交叉熵为损失函数cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y_conv))#定义训练步骤,使用AadmOptimizer最小化损失函数——交叉熵train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)#获得正确样本correct_prediction = tf.equal(tf.argmax(y_conv, 1),tf.argmax(y_,1))#取得准确率accuracy= tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#初始化Session会话sess = tf.Session()#将所有定义的Summary操作进行整合merged = tf.summary.merge_all()#保存Summary的图形结构writer = tf.summary.FileWriter("logofmnist2/",sess.graph)#初始化所有变量,准备启动Sessionsess.run(tf.global_variables_initializer())#开始训练#定义训练次数为20000次for i in range(20000): #选取100个样本作为一批训练样本 batch = mnist.train.next_batch(100) #进行训练,定义输入与标签,并定义dropout概率为0.5 sess.run(train_step,feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5}) #每一百次训练输出正确率 if i % 100 == 0: train_accuracy = accuracy.eval(session=sess,feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0}) print ("step %d, training accuracy %g" % (i,train_accuracy)) #result = sees.run(merged,feed_dict={x:batch[0],y:batch[1]}) #writer.add_summary(result,i)OUT: step 0, training accuracy 0.19 step 100, training accuracy 0.92step 200, training accuracy 0.89 step 300, training accuracy 0.88step 400, training accuracy 0.94 step 500, training accuracy 0.91step 600, training accuracy 0.98 step 700, training accuracy 0.95step 800, training accuracy 0.97 step 900, training accuracy 0.94step 1000, training accuracy 0.93 step 1100, training accuracy 0.96step 1200, training accuracy 0.99 step 1300, training accuracy 0.94step 1400, training accuracy 0.98 step 1500, training accuracy 0.98step 1600, training accuracy 0.97 step 1700, training accuracy 0.98step 1800, training accuracy 0.99 step 1900, training accuracy 0.96step 2000, training accuracy 0.99 step 2100, training accuracy 0.97step 2200, training accuracy 0.99 step 2300, training accuracy 1step 2400, training accuracy 1 step 2500, training accuracy 0.99step 2600, training accuracy 0.97 step 2700, training accuracy 0.98step 2800, training accuracy 0.98 step 2900, training accuracy 0.98step 3000, training accuracy 0.99 step 3100, training accuracy 0.98step 3200, training accuracy 0.99 step 3300, training accuracy 1step 3400, training accuracy 0.97 step 3500, training accuracy 0.98step 3600, training accuracy 0.98 step 3700, training accuracy 0.99step 3800, training accuracy 0.99 step 3900, training accuracy 0.99…