最近入门 tensorflow 用简单卷积神经网络做 MNIST 手写数字识别, 参考Pluralsight中教程 的代码 如下: 定义filter以及bias的函数:
import tensorflow as tf
def weightVariable(shape): # to generate the filter initial = tf.truncated_normal(shape,stddev=1.0) return tf.Variable(initial) def biasVariable(shape): initial = tf.constant(0.1,shape=shape) return tf.Variable(initial) def conv2d(x,W): # input the x as iamge : [batch, nwidth, nheight, chennals] return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding ='SAME') def MaxPooling_2x2(x): return tf.nn.max_pool(x,ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME') 导入数据以及 利用数据集的随机样本 训练网络: from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets( r"C:\Myfiles\deepTraining\Tensorflow\Course_tensorflow-understanding-foundations\Practice\mnist_data",one_hot=True) training_digits, training_labels = mnist.train.next_batch(200) # get the data point randomly test_digits, test_labels = mnist.test.next_batch(100) print("Data is ready") print(test_digits.shape) print(test_labels.shape) # construct the net; Xinput = tf.placeholder(tf.float32,shape=[None,784]) ylable = tf.placeholder(tf.float32,shape=[None,10]) x_image = tf.reshape(Xinput,[-1,28,28,1],name="image") # x_image [batch, 28,28,1] W_conv1 = weightVariable([5, 5, 1, 32]) # difine the filter size would be 5 by 5; 1 is the chennal number # if it is a color picture the number would be 3, # 32 is the features output chennals, 32 is defined by us b_conv1 = biasVariable([32]) FirstConLayerOutput = conv2d(x_image, W_conv1) + b_conv1 # FirstConLayerOutput size: [batch,28,28,32] # push to relu function; # relu funciton would keep the same size the data h_con1 = tf.nn.relu(FirstConLayerOutput) # h_con1: [batch,28,28,32] h_pool1 = MaxPooling_2x2(h_con1) # h_pool1: [batch,14,14,32] W_conv2 = weightVariable([5,5,32,64]) # 32 means the h_pool1 has 32 output chennals b_conv2 = biasVariable([64]) SecondConLayerOutput = conv2d(h_pool1, W_conv2) + b_conv2 # SecondConLayerOutput: [batch,14,14,64] h_con2 = tf.nn.relu(SecondConLayerOutput) # h_con2: [batch,14,14,64] h_pool2 = MaxPooling_2x2(h_con2) # h_pool2: [batch,7,7,64] # Then define the fully connect layer ; Wfc1 = weightVariable([7 * 7 * 64, 1024]) bfc1 = biasVariable([1024]) h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64]) # h_pool2_flat: [batch, 7*7*64] hfc1 = tf.nn.relu(tf.matmul(h_pool2_flat, Wfc1) + bfc1) # hfc1: [batch, 1024] keep_prob = tf.placeholder(tf.float32) h_fc_drop = tf.nn.dropout(hfc1, keep_prob) # the drop out operation would not change the dimensions Wfc2 = weightVariable([1024,10]) bfc2 = biasVariable([10]) hfc2 = tf.matmul(h_fc_drop, Wfc2) + bfc2 # hfc1 [batch, 10] cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=hfc2,labels=ylable)) trainStep = tf.train.AdamOptimizer(1e-3).minimize(cross_entropy) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) import time num_steps = 1000 display_every = 100 print("start:") start_time = time.time() end_time = time.time() for istep in range(800): onebatch = mnist.train.next_batch(13) trainStep.run(feed_dict={Xinput: onebatch[0], ylable: onebatch[1], keep_prob: 0.5}) Y_fit = sess.run(tf.argmax(hfc2,1),{Xinput: onebatch[0], ylable: onebatch[1], keep_prob: 0.5}) print(str(istep)+str(Y_fit)) #print(Y_predict.shape) print("#----------------------------------------------------------------#") # 测试一下训练结果; 随机抽取 14个样本 比较识别结果 ; testbatch = mnist.train.next_batch(14) Y_predict = sess.run(tf.argmax(hfc2, 1),{Xinput: testbatch[0], ylable: testbatch[1], keep_prob: 0.5}) Y_test = sess.run(tf.argmax(testbatch[1],1)) print("Predict: ") print(Y_predict) print("Test database") print(Y_test)