使用numpy實現caffe/LeNet模型的前向檢測

本文記錄了筆者探究caffe基於MNIST數據集訓練出的LeNet的前向檢測的計算,並使用numpy重新實現了這一計算過程,以加深從運算層面對卷積神經網絡的理解。筆者實現的簡單Python代碼可以在https://github.com/LinkYe/LearnDeep獲得。

首先需要caffe訓練生成的模型文件,lenet_iter_10000.caffemodel,這可以按照caffe官方的文檔基於MNIST數據集訓練得到。將該模型文件複製到caffe-weights.py所在的目錄,並執行該腳本,可讀取caffemodel中的權重參數並存儲爲NPZ文件。在創建mnistLeNet對象時,會讀取這個NPZ文件LeNet-Caffe.npz:

 如上圖,在讀取權重時,會將第一層和第二層卷積核進行翻轉(圖中紅色框),這是因爲caffe中的卷積核已經是翻轉過的;但scipy庫提供的convolve2d的接口在進行二維卷積運算時,會再次進行翻轉。隨後,爲mnistLeNet類增加了卷積的接口及池化的接口,最後就是前向檢測的運算過程:

 

由上圖可以較爲清晰地看到輸入的圖片經過的四層的計算,最終返回一個有10個元素的向量。爲了測試mnistLeNet的檢測功能,需要進行以下操作:

 我們通過Python Machine Learning一書中的Load_mnist()來讀取MNIST測試數據(圖中第4行),之後對預測的結果調用softmax來得到一個0到9的可信度列表,retv(圖中第7行)。可以看到,預測結果最大可信度的對應值爲9,這與圖像對應的標籤是相同的,那麼可以在一定程度上認爲我們實現的可LeNet前向檢測計算結果是正確的。

接下來我們調用caffe的接口,對該圖像進行前向檢測運算:

可見,其預測的可信度列表與我們用mnistLeNet得到的可信度列表差別微小,因此可以認爲爲LeNet/caffe實現的前向檢測運算是沒有問題的。最後,可以執行predictImage.py對MNIST的一萬個測試圖進行預測,筆者得到的正確率達到99%以上。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章