3层-CNN卷积神经网络预测MNIST数字
3層-CNN卷積神經網絡預測MNIST數字
本文創建一個簡單的三層卷積網絡來預測 MNIST 數字。這個深層網絡由兩個帶有 ReLU 和 maxpool 的卷積層以及兩個全連接層組成。
MNIST 由 60000 個手寫體數字的圖片組成。本文的目標是高精度地識別這些數字。
具體實現過程
-
導入 tensorflow、matplotlib、random 和 numpy。然后,導入 mnist 數據集并進行獨熱編碼。請注意,TensorFlow 有一些內置的庫來處理 MNIST,也會用到它們:
-
仔細觀察一些數據有助于理解 MNIST 數據集。了解訓練數據集中有多少張圖片,測試數據集中有多少張圖片。可視化一些數字,以便了解它們是如何表示的。這種輸出可以對于識別手寫體數字的難度有一種視覺感知,即使是對于人類來說也是如此。
上述代碼的輸出:
圖 1 MNIST手寫數字的一個例子
-
設置學習參數 batch_size和display_step。另外,MNIST 圖片都是 28×28 像素,因此設置 n_input=784,n_classes=10 代表輸出數字 [0-9],并且 dropout 概率是 0.85,則:
-
設置 TensorFlow 計算圖的輸入。定義兩個占位符來存儲預測值和真實標簽:
-
定義一個輸入為 x,權值為 W,偏置為 b,給定步幅的卷積層。激活函數是 ReLU,padding 設定為 SAME 模式:
-
定義一個輸入是 x 的 maxpool 層,卷積核為 ksize 并且 padding 為 SAME:
-
定義 convnet,構成是兩個卷積層,然后是全連接層,一個 dropout 層,最后是輸出層:
-
定義網絡層的權重和偏置。第一個 conv 層有一個 5×5 的卷積核,1 個輸入和 32 個輸出。第二個 conv 層有一個 5×5 的卷積核,32 個輸入和 64 個輸出。全連接層有 7×7×64 個輸入和 1024 個輸出,而第二層有 1024 個輸入和 10 個輸出對應于最后的數字數目。所有的權重和偏置用 randon_normal 分布完成初始化:
-
建立一個給定權重和偏置的 convnet。定義基于 cross_entropy_with_logits 的損失函數,并使用 Adam 優化器進行損失最小化。優化后,計算精度:
-
啟動計算圖并迭代 training_iterats次,其中每次輸入 batch_size 個數據進行優化。用從 mnist 數據集分離出的 mnist.train 數據進行訓練。每進行 display_step 次迭代,會計算當前的精度。最后,在 2048 個測試圖片上計算精度,此時無 dropout。
-
畫出每次迭代的 Softmax 損失以及訓練和測試的精度:
以下是上述代碼的輸出。首先看一下每次迭代的 Softmax 損失:
圖 2 減少損失的一個例子
再來看一下訓練和測試的精度:
圖 3 訓練和測試精度上升的一個例子
解讀分析
使用 ConvNet,在 MNIST 數據集上的表現提高到了近 95% 的精度。ConvNet 的前兩層網絡由卷積、ReLU 激活函數和最大池化部分組成,然后是兩層全連接層(含dropout)。訓練的 batch 大小為 128,使用 Adam 優化器,學習率為 0.001,最大迭代次數為 500 次。
總結
以上是生活随笔為你收集整理的3层-CNN卷积神经网络预测MNIST数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卷积神经网络(CNN,ConvNet)
- 下一篇: PyTorch 自动微分