CNN-mnist手寫數字識別


Tensorflow+CNN下的mnist數據集手寫數字識別

  1. 加載數據集

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模型在工作站

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM