使用NumPy實現GoogLeNet的前向檢測功能

2014年GoogLeNet的出現,再次刷新了圖像分類檢測的準確率。在《Going Deeper with Convolutions》論文中,提出了Inception神經網絡架構,隨後又出現了Inception-v2、Inception-v3等優化的架構。與AlexNet相比,Inception架構更爲複雜,不過使用Numpy實現其前向檢測的運算,也是可行的。本文記錄了筆者實現的這一過程。相關代碼可在https://github.com/LinkYe/LearnDeep/tree/master/Inception-caffe獲得。

首先,需要下載Caffe官網提供的GoogLeNet訓練的權重文件,URL爲http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel;該文件的大小有52MB,約爲AlexNet的權重文件大小的四分之一,Inception網絡結構的優越性可見一斑。
然後,可以通過執行what.py腳本,查看GoogLeNet的各層權重的Tensor形狀,和輸出Tensor的形狀。執行命令:python3 what.py > what.txt,並查看what.txt,如下圖:

 

由上圖可知,GoogLeNet的權重數量很多,結構很複雜。Blob爲每層輸出的Tensor的形狀,BlobVec則爲每一層的卷積核。論文中提出了Inception模塊,並在整個前向計算中重複了多次,下面就是Inception模塊計算的實現:

 

在方法incept(...)中,輸入的pImg被多次使用到,最後將4個計算過程的輸出疊加成爲一個Tensor,這樣看來,輸出的結果是複合的,這不是一純粹的feed-forward過程。之後,就是前向的計算過程了:

 最後,可以執行python3 -i run-inception.py運行實現的GoogLeNet的檢測功能了,它全自動加載cat.jpg:

 見上圖,我們也將caffe的結果輸出了,對比可知我們的計算過程是正確的。不過由於置信度忘記乘以100,所以上面的結果差了100倍。也可以手動執行detect_img('XXX.jpg'),對圖片進行檢測:

 至此,我們又見到了一種架構較爲複雜的分類器的前向計算過程,這樣以後探究其他一些更爲複雜的網絡了。

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