使用numpy實現caffe/AlexNet圖像分類器的前向檢測功能

雖然卷積神經網絡之前已存,但AlexNet網絡的實現加快了卷積深度神經網絡的發展,這一點讓AlexNet居功至偉。與之前的一篇LeNet的前向檢測的計算相比,AlexNet網絡的前向計算要複雜得多,共有五個卷積層和三個全連接層。還有兩個額外的Local Response Normalization的運算,以進一步增強神經網絡的準確度,用numpy實現起來也頗費周折。本文提到的相關Python代碼可在https://github.com/LinkYe/LearnDeep上獲得。

首先,筆者缺少環境訓練AlexNet,模型文件是caffe官網下載的:http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel。執行alexnet-weight.py將該模型文件重寫爲NPZ文件,在創建AlexNetCM對象時讀取它:

讀取的五個卷積核需要進行翻轉,這一點在上一篇文章也提到過,這裏使用了flipReverse()方法。之後爲AlexNetCM類實現了卷積/池化/LRN等方法,最後着重是前向檢測的運算過程: 

 與LeNet的前向檢測運算相比,AlexNet網絡的運算的卷積有很多的不同。其一是卷積的過程可能會分成兩組,如圖中的ngroup=2,還有第一層卷積的步長爲4,如圖中的stride=4。另外,後面四個卷積層的模式是SAME,即輸入的圖像大小與卷積的輸出大小是相同的,因此指定了padLen爲非零。

爲了測試我們的AlexNetCM類的功能,在命令行執行python3 -i caffe-AlexNet.py,會對一張圖片調用AlexNetCM及caffe檢測,對比結果;詳細的實現可參見caffe-AlexNet.py的最後五十多行。下面是筆者對一張圖片的檢測結果: 

 

令人驚詫的是,結果完全相同!這很讓人欣慰——不過,由於LRN的性能很低,筆者實現的前向檢測需要幾十秒的時間才能完成。在上圖執行完成後,可以手動輸入detect_img進行檢測。至此通過“重複造車”,我們基於numpy實現了AlexNet網絡的前向檢測的運算,進一步加深了對卷積深度神經網絡的理解。

 

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