TensorFlow筆記(二)---多層感知機識別手寫數字
Softmax Regression無隱含層,在MNIST資料集上取得了大約92%的正確率,提高準確度,要給神經網路加上隱含層,並使用能減輕過擬合的Dropout,自適應學習速率的Adagrad以及可以解決梯度彌散的啟用函式ReLU.
定義演算法公式即神經網路前向(forward)時的計算
載入資料
隱層引數設定並初始化
Dropout的比率設定:在訓練時應該小於1來製造隨機性防止過擬合,在預測時應該等於1,用全部特徵來預測樣本的類別。
定義模型結構:
隱含層,dropout功能,輸出層(softmax)
定義損失函式和選擇優化器來優化loss
損失函式用交叉資訊熵
優化器選擇自適應的優化器Adagrad,把學習速率設為0.3
訓練
加入keep_prob作為計算圖的數日,在訓練時設為0.75,即保留75%的節點,其餘的25%設為0.
共採用3000個batch,每個batch包含100條樣本,一共30萬樣本,相當於對全資料集進行了5輪(epoch)迭代。
對模型進行準確率評測
預測時將keep_prob直接設為1,這樣可以達到模型最好的預測效果。
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 7 16:31:56 2018
@author: wf
"""
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist=input_data.read_data_sets('MNIST_data/',one_hot=True)#匯入資料
sess=tf.InteractiveSession()#
in_units=784 #輸入層節點數
h1_units=300 #隱含層節點數
W1=tf.Variable(tf.truncated_normal([in_units,h1_units],stddev=0.1))#初始化權重,w1截斷分佈,標準差0.1
b1=tf.Variable(tf.zeros([h1_units]))
W2=tf.Variable(tf.zeros([h1_units,10 ]))
b2=tf.Variable(tf.zeros([10]))
#設定輸入和drop比率輸入
x=tf.placeholder(tf.float32,[None,in_units])
keep_prob=tf.placeholder(tf.float32)
#定義模型的結構
hidden1=tf.nn.relu(tf.matmul(x,W1)+b1)#隱含層啟用函式為relu
hidden1_drop=tf.nn.dropout(hidden1,keep_prob)#隱含層drop out
y=tf.nn.softmax(tf.matmul(hidden1_drop,W2)+b2)#輸出啟用函式為softmax
#定義損失函式和選擇優化器優化loss
y_=tf.placeholder(tf.float32,[None,10])
cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))#設定損失函式為交叉熵
train_step=tf.train.AdagradOptimizer(0.3).minimize(cross_entropy) #定義梯度下降最小化損失函式
#train
tf.global_variables_initializer().run()#全域性初始化
for i in range(3000):
batch_xs,batch_ys=mnist.train.next_batch(100)#獲取batch
train_step.run({x:batch_xs,y_:batch_ys,keep_prob:0.75})#開始訓練
#準確率評估
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) #判斷類別
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print(accuracy.eval({x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0}))
最終準確率大約98%,相比之前Softmax,誤差率由8%下降到2%。沒有隱含層的Softmax Regression只能直接從影象的畫素點推斷是哪個數字,而沒有特徵抽象的過程。多層神經網路依靠隱含層,則可以組合出高階特徵,eg橫線、豎線、圓圈等,之後可以將這些高階特徵或者說元件再組合成數字,就能實現精確的匹配和分類。隱含層輸出的高階特徵經常是可以複用的,所以每一類的判別、概率輸出都共享這些高階特徵,而不是各自連線獨立的高階特徵。
但是使用全連線神經網路(Fully Connected Network,FCN,MLP的另一種說法)也是有侷限性的,即使我們使用很深的網路,很多隱藏節點,很大迭代輪數也很難在MNIST資料集上達到99%以上的準確率。有卷積神經網路CNN會有更高的準確率,能真正滿足識別銀行支票這種高精度系統的要求。