雖然卷積神經網絡之前已存,但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網絡的前向檢測的運算,進一步加深了對卷積深度神經網絡的理解。