神經網路實現Mnist資料集簡單分類

2021-08-21 23:51:51 字數 4000 閱讀 3459

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

首先要載入資料集

#載入資料集

mnist = input_data.read_data_sets('mnist_data',one_hot=true)

#設定批次大小

batch_size = 200

#計算批次數量

n_batch = mnist.train.num_examples // batch_size

載入資料集可以直接呼叫input_data下的read_data_sets方法,括號裡的路徑我是放在了當前目錄下可以直接引用,當然也可以引用檔案的絕對路徑

x = tf.placeholder(tf.float32,[none,784])

y = tf.placeholder(tf.float32,[none,10])

keep_prob = tf.placeholder(tf.float32)

接著建立三個placeholder佔位符,none表示可以是任意維度的張量,784是由每乙個手寫數字為28*28的畫素伸展成一維向量的原因,10表示待分為的0-910個類別,keep_prop表示神經網路訓練時設定神經元的存活率,如果為1,表示所有神經元參與工作,相當於不設定這個值,如果為0.6表示有60%的神經元參與工作。

然後搭建四層神經網路

#第一層隱藏層,2000個神經元

w1 = tf.variable(tf.truncated_normal([784,2000],stddev=0.1))

b1 = tf.variable(tf.zeros([2000])+0.1)

l1 = tf.nn

.tanh(tf.matmul(x,w1)+b1)

l1_drop = tf.nn

.dropout(l1,keep_prob)

#第二層隱藏層

w2 = tf.variable(tf.truncated_normal([2000,2000],stddev=0.1))

b2 = tf.variable(tf.zeros([2000])+0.1)

l2 = tf.nn

.tanh(tf.matmul(l1,w2)+b2)

l2_drop = tf.nn

.dropout(l2,keep_prob)

#第三層神經網路

w3 = tf.variable(tf.truncated_normal([2000,1000],stddev=0.1))

b3 = tf.variable(tf.zeros([1000])+0.1)

l3 = tf.nn

.tanh(tf.matmul(l2,w3)+b3)

l3_drop = tf.nn

.dropout(l3,keep_prob)

#第四層神經網路

w4 = tf.variable(tf.truncated_normal([1000,10],stddev=0.1))

b4 = tf.variable(tf.zeros([10])+0.1)

prediction = tf.nn

.tanh(tf.matmul(l3,w4)+b4)

tf.truncated.normal為正態分佈函式,stddev表示標準差為0.1

w為權值矩陣,b為偏置值,在第一層中有784個輸入節點,2000個隱藏神經元。啟用函式使用的是雙曲正切函式tanh。值得注意的一點是,在每次計算li的值時,需要使用li-1的值和當前層數的權值矩陣加上當前層數的偏置值,在神經網路中表示由上一層的結果作用於本層神經網路,然後本層神經網路訓練的值接著作用於下一層,依次迴圈。

#loss = tf.reduce_mean(tf.square(y-prediction))

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))

optimizer = tf.train.gradientdescentoptimizer(0.4)

train = optimizer.minimize(loss)

#初始化變數

init = tf.global_variables_initializer()

accuracy_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1)) 

#計算準確率

accuracy = tf.reduce_mean(tf.cast(accuracy_prediction,tf.float32))

argmax表示返回一維張量最大值的位置,tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))如果前面的位置和後面返回的位置一致,則輸出1,否則為0。比如tf.argmax(y,1)實際最大值位置為4,tf.argmax(prediction,1)**最大值位置為4,則返回1。所以accuracy_prediction裡面存的全是布林型值。tf.cast(accuracy_prediction,tf.float32)是將前者變數轉換為後者資料型別

with tf.session() as sess:

sess.run(init)

for epoch in range(20):

for batch in range(n_batch):

batch_xs,batch_ys = mnist.train.next_batch(batch_size) #batch_xs每次獲得batch_size大小,batch_ys獲得標籤

sess.run(train,feed_dict=) #keep_prob值0.6表示6成神經元參與工作

#每一輪輸出準確率

test_acc = sess.run(accuracy,feed_dict=)

train_acc = sess.run(accuracy, feed_dict=)

print('iter:'+str(epoch)+' test_accuracy:'+str(test_acc)+' train_acc:'+str(train_acc))

根據keep_prob的值不同做了乙個特意的對比實驗,當keep_prob的值設定為1時,訓練結果部分如下:

從結果可以看出,訓練的準確率比測試的準確率要高大約0.2個百分點,這樣看起來可能比較小,但是一旦當資料集擴大,這種差距會非常大,造成過擬合的現象。

再把keep_prob的值設定為0.6時,得到實驗結果如下

這樣兩者的差距在0.005左右,很大程度上緩解了過擬合現象。

原因因為當keep_prob的值設為1時所有的神經元全部參與,其實是相當於暴力的記憶住了當前的訓練集,因此在訓練集上有很好的效果,但是一旦離開這個訓練集,就會沒辦法擬合新的資料點而導致準確率下降。而當值適當減小時,其實就是模擬了人腦的記憶曲線,總會有些東西是會遺忘的,因而在訓練時雖然收斂的比較慢,但是泛化能力確增強了。

卷積神經網路 Mnist資料集測試

卷積神經網路 mnist是在機器學習領域中的乙個經典問題。該問題解決的是把28x28畫素的灰度手寫數字識別為相應的數字,其中數字的範圍從0到9.print 第 d步正確率 f i,accuracy.eval feed dict 通過只有乙個全連線層來實現的網路的準確率大概只有91 這樣的 訓練結果並...

用簡單卷積神經網路實現MNIST資料集識別

第一次寫部落格,記錄一下最近的學習經歷吧,最近在學卷積神經網路,自己就寫了乙個比較簡單的卷積神經網路實現了mnist資料集的識別,本來是想用lenet5來實現的,感覺lenet5太老了,所以就寫了乙個差不多的卷積神經網路來實現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 每個批次的大小 bat...