LeNet5介紹
LeNet-5是一種高效的卷積神經網絡,在論文《Gradient-Based Learning Applied to Document Recognition》中 有詳細的解釋,它在大家熟知的手寫數字識別項目中它得到廣泛地使用。該網絡一共有7層,依次為:卷積層、池化層、卷積層、池化層、全連接層、全連接層(輸出層)。
分類訓練的準備工作
準備數據集設計網絡結構數據集的準備傑瑞在前一篇文章中已經講過了,所以在本篇文章中就不再闡述了,今天主要寫一下網絡結構的設計。今天教程中所使用的模型是LeNet-5模型,如上圖,想必大家已經知道該網絡的大概結構了吧?現在要做的就是用python代碼實現上圖中的網絡結構。
主要函數:
tf.nn.conv2d()
tf.nn.max_pool()
tf.nn.lrn()
tf.nn.conv2d()函數主要用來進行卷積操作,tf.nn.max_pool()函數主要用來進行池化操作,tf.nn.lrn()用來對數據進行歸一化。
代碼實踐
tf.nn.conv2d()的參數:input, filter
傑瑞一個batch的數據形狀為[?, 64*64],所以在數據進入網絡之前必須要將數據形狀改變成[?, 64, 64, 1]。因為tf.nn.conv2d()函數第一個參數input需要[batch_size,圖片高度,圖片寬度,圖片深度]形狀的tensor。
filter就是我們用來進行卷積操作的卷積核,實際上它也是一個tensor,我們通過tf.Variable()函數來定義它,以下是定義卷積核的代碼:
卷積完成之後我們就可以與偏執量一起求和了,最後經過一個激活函數Relu作為池化層的輸入。
池化層
池化層我們通過tf.nn.max_pool()函數來實現,第一個參數就是需要池化的輸入,第二個參數是池化窗口的大小,這裡設置為[1, 3, 3, 1],第三個參數是步長,這裡設置為[1, 1, 1, 1]。
池化過後我們需要進行局部響應歸一化,把反映響應比較大的值變得相對更大,並抑制其他反饋較小的神經元,說白了就是將明顯「特徵」放大,不明顯「特徵」減小。
剩下的5層的創建和上面兩層的創建步驟差不多,所以就不重複解釋了,直接把代碼貼上來:
以上圖片中的代碼按順序排列構成LeNet-5網絡結構。
損失函數與優化方法
傑瑞使用tf.nn.softmax_cross_entropy_with_logits()方法計算交叉熵,並使用tf.train.AdamOptimizer()方法實現梯度下降較小損失值。
開啟會話進行訓練
這裡我們直接開啟會話進行訓練,在下圖中可以看到損失值的變化:
關注《高手傑瑞》,每天更新哦!