天天看點

MNIST資料集兩層神經網絡分類

MNIST資料集兩層神經網絡分類

>>> import tensorflow as tf
>>> from tensorflow.examples.tutorials.mnist import input_data
>>> mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)
//導入資料集到對象mnist
           
>>> x=tf.placeholder(tf.float32,[None,784])//訓練圖像的占位符
>>> y_=tf.placeholder(tf.float32,[None,10])//訓練标簽的占位符
>>> x_image=tf.reshape(x,[-1,28,28,1])
//将單張圖檔從784維轉出28*28矩陣圖檔
           
>>> 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')
//最大池化
           
#第一層卷積層
>>> 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)
>//卷積計算,并用relu作為激活函數
>>> 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)
           
>>> keep_prob=tf.placeholder(tf.float32)
>>> h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
//使用Dropout,keep_prob是一個占位符,訓練時為0.5,測試時為1
           

在全連接配接層中加入Dropout,它是防止神經網絡過拟合的一種手段,在每一步訓練的時候,以一定機率去掉網絡中的某些連接配接,但這不是永久的,隻在目前步驟中去除,且每一次是随機去除的。

>>> W_fc2=weight_variable([1024,10])
>>> b_fc2=bias_variable([10])
>>> y_conv=tf.matmul(h_fc1_drop,W_fc2)+b_fc2
//再加入一層全連接配接層把上一步得到的h_fc1_drop轉化為10個類别的打分
           
>>> cross_entropy=tf.reduce_mean(
	tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y_conv))
//不采用先softmax再計算交叉熵的方法
而是直接利用tf.nn.softmax_cross_entropy_with_logits計算交叉熵
>>> train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
//采用Adam優化交叉熵
           
>>> correct_prediction=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
>>> accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
//定義測試的準确率
           
>>> sess=tf.InteractiveSession()//建立會話
>>> sess.run(tf.global_variables_initializer())//對變量初始化
           
>>> for i in range(20000):
	batch=mnist.train.next_batch(50)
//訓練20000次,每次batch為50個樣本
           
#每100次報告在驗證集上的準确度
>>> 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 %g"%accuracy.eval(feed_dict={
	x:mnist.test.images, y_:mnist.test.labels,keep_prob:1.0}))
//報告測試集上的準确率
           

繼續閱讀