该网络有两个卷积层(将池化层包含在卷积层中),一个全连接层,一个dropout层和一个输出层(SoftMax层)。测试集上面运行结果是99.34%。
实现卷积神经网络的步骤:
第一:定义算法公式,也就是神经网络的前向计算
第二:定义loss,选定优化器,并指定优化loss
第三;迭代地对数据进行训练
第四:在测试集或验证集上对评价指标进行评测
代码:
# -*- coding: utf-8 -*- import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 下载数据,若有就不用下载 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) sess=tf.InteractiveSession() # 由于卷积神经网络会有很多的权重和偏置需要创建,为实现代码复用就创建了初始化函数 def weight_variable(shape): initial=tf.truncated_normal(shape=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(x): return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') #定义输入的placeholder,需要提取空间结构,因而需要将1D的输入向量转为2D的图片结构 x=tf.placeholder(tf.float32,shape=[None,784]) y_=tf.placeholder(tf.float32,shape=[None,10]) x_image=tf.reshape(x,shape=[-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(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(h_conv2) # 定义全连接层(全连接执行前将卷积层输出的2Dfeature map 转为1D向量,然后再全连接,隐含节点为1024) w_fc1=weight_variable([7*7*64,1024]) b_fc1=bias_variable([1024]) h_pool2_reshape=tf.reshape(h_pool2,[-1,7*7*64]) h_fc1=tf.nn.relu(tf.matmul(h_pool2_reshape,w_fc1)+b_fc1) # 为缓解过拟合,添加了一个dropout层 keep_prob=tf.placeholder(tf.float32) h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob=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) # 定义损失函数并选择优化器 cross_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.argmax(y_conv,1),tf.argmax(y_,1)) accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) # 开始训练过程 tf.global_variables_initializer().run() for i in range(30000): batch=mnist.train.next_batch(50) if i%100==0: train_accuracy=sess.run(accuracy,feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0}) print "step %d,training accuracy %g"%(i,train_accuracy) sess.run(train_step,feed_dict={x:batch[0],y:batch[1],keep_prob:0.5}) # 打印输出测试结果 print "test accuracy %g"%sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})