Tensorflow+CNN下的mnist數據集手寫數字識別
- 加載數據集
MNIST數據集包含55000個訓練樣本,10000個測試樣本,還有5000個交叉驗證數據樣本。
輸入:加載的每個手寫數字圖像是28 x 28像素大小的灰度圖像。為了簡化起見,將28x28的像素點展開為一維數據(shape=784)。
輸出:每張測試圖片的預測結果y為一個10維數組,數組中值的取值范圍為[0,1],使用tf.argmax(y,1),取出數組中最大值的下標,再用獨熱表示以及模型輸出轉換成數字標簽。
2.定義算法公式,也就是前向計算的計算圖
處理多分類任務,通常采用Softmax模型。y = Softmax(Wx + b),其中W為權值矩陣,b為偏置向量,x為輸入特征矩陣。
使用Softmax函數是將各個類別的打分轉換成合理的概率值。其中權值矩陣W是將784維的輸入轉換成一個10維的輸出。
本實驗中使用的的CNN模型,是將輸入的784維的輸入向量,還原為28x28的圖片格式,再經過兩次卷積層、一次全連接層處理后,得到的1024維的向量轉換成10維,即對應10個類別,調用Softmax函數將其轉換成10個類別的概率。
Weight_variable()和bias_ariable()為初始化權重和偏置的初始化函數,給權重制造一些隨機的噪聲來打破對稱,而給偏置增加一些小的正值(0.1)來避免死亡節點
Cov2d()和max_pool_2x2()為定義卷積層與池化層,使用的為tensorflow自帶的二維卷積函數與池化函數。
第一層的卷積層:
卷積:卷積特征提取采用5x5,輸入為1維,輸出為32維。
W_conv1 = weight_variable([5 ,5, 1 ,32]) # patch 5x5, in size 1, out size 32
conv2d(x_image, W_conv1) + b_conv1
激活:卷積之后使用ReLU作為激活函數。原因為增加非線性激活函數,增強擬合復雜函數的能力。
tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # output size 28x28x32
池化:池化窗口的大小設置為了2x2, 窗口在每一個維度上滑動的步長也設置為了2x2,所以圖像由28x28x32-->14x14x32。
max_pool_2x2(h_conv1)
第二層卷積,與第一層卷積類似,輸入由圖像變成第一次卷積后結果,輸出圖像由14x14x64-->7x7x64
兩次卷積之后,是全連接層,輸出為1024維的向量
全連接層中加入了Dropout防止神經網絡過擬合,選擇的Dropout概率keep_prob為0.5,但訓練的時候每一個連接都有50%的概率被去除,測試的時候keep_prob為1,即保留所有連接。
再設置一層全連接,將上一步的到的h_fcl_drop轉換成10個類別的打分,在使用Softmax函數將其轉化成10個類別的概率。
3.定義損失函數(loss function),選定優化器,並指定優化器優化損失函數
對於多分類問題,通常采用交叉熵(cross-entropy)作為損失函數。交叉熵的定義如下,其中y是預測的概率分布,y’是真實的概率分布:
選擇交叉熵作為損失函數,但優化器選擇自適應的優化器Adagrad,並把學習率設為0.0001。(Softmax回歸函數實現mnist手寫數字識別使用的為GradientDescentOptimizer梯度下降算法優化器)
4.對數據進行迭代訓練
模型迭代訓練1000次,每次從訓練集中隨機選出100個樣本訓練一次。每隔50次訓練,打印模型的預測准確率。
5.在測試集上進行准確率評估。
每一次測試結果准確度的函數定義:
6.Mnist數據集在Softmax回歸函數、深度神經網絡DNN、卷積神經網絡模型CNN下運行結果。
模型名稱 |
Softmax |
DNN |
CNN |
訓練次數 |
1000 |
1000 |
1000 |
每次樣本數 |
100 |
100 |
100 |
優化器 |
GradientDescentOptimizer |
AdagradOptimizer |
AdamOptimizer |
學習率 |
0.5 |
0.3 |
0.0001 |
准確度 |
0.9128 |
0.9737 |
0.9681 |
1) Softmax回歸函數預測准確度為92%左右,訓練中會出現過擬合問題,准確度驟降至很低。
2) CNN實驗中使用的卷積神經網絡為官方demo,樣本訓練次數加大到20000次時,准確度可以達到99.37%。實驗中原程序中卷積層的特征提取窗口大小、維度,池化層中的池化窗口大小、步長,實驗中的優化器AdagradOptimizer學習率,都可以作為后續學習中的調參對象。
3) DNN實驗中定義了addConnect函數, 4個參數中第1個參數是輸入層矩陣Inputs;第2個參數是連接上一層神經元個數in_size; 第3個參數是連接下一層神經元個數;第4個參數是激活函數。
實驗中添加第1個連接層,輸入參數為784維的圖片向量、神經元個數為784、連接下一層的神經元個數300,激活函數ReLU,並將其輸出結果賦值給變量connect_1;添加第2個連接層,輸入參數為connect_1、神經元個數為300、連接下一層的神經元個數10,激活函數ReLU,並將其輸出結果賦值給變量predict_y,即標簽預測值。如下圖所示:
4) 優化器optimizer:實驗中使用了GradientDescentOptimizer、AdamOptimizer,對比可得,AdagradOptimizer在此問題的收斂效果較好。
運行結果截圖:
從左到右依次為:Softmax回歸函數、DNN、CNN(其中CNN模型在工作站