上一篇文章我們介紹了下VGG這一個經(jīng)典的深度學(xué)習(xí)模型,今天便讓我們通過使用VGG開源的VGG16模型去復(fù)現(xiàn)一下該論文.
話不多說,直接上代碼:
一:了解結(jié)構(gòu)
上述文件便是我們復(fù)現(xiàn)VGG時候的所有文件,其中cat和pic是我們的測試圖像,在這一次的代碼里,因為考慮到不同人的不同設(shè)備之間的訓(xùn)練速度有所差異,我們一次只讀取一張圖片進(jìn)行識別.其中,VGG16.py是我們的主要文件,在這個文件中我們復(fù)現(xiàn)了VGG16的網(wǎng)絡(luò)架構(gòu),untils.py為我們輸入圖片預(yù)處理的程序,Nclasses.py則是我們給定的每個圖像的標(biāo)簽,以及對應(yīng)的索引值,最后的app.py則是我們的調(diào)用文件,最終我們只需要調(diào)用它即可.
二:詳述代碼
1:VGG16.py
代碼如下:
這一部分我們是導(dǎo)入了常用的一些模塊,這些模塊不必多說,主要是VGG_MEAN這句話需要解釋下,
在https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md?中他們介紹到我們輸入的圖像應(yīng)該以平均的像素去求解,也就是最后我們需要用BGR去求解,因此我們要減去這一些像素值即可
在這里我們后續(xù)的代碼都將寫入到VGG16這個類當(dāng)中,當(dāng)前部分的操作,我們引入VGG16.npy這個二進(jìn)制文件,并且遍歷data_dict中的每個鍵,并且打印輸入.
這一個部分我們是創(chuàng)建在前向傳播中要調(diào)用的卷積核,偏置,池化層以及全連接層,大家觀察代碼會發(fā)現(xiàn),這里的創(chuàng)建的結(jié)果其實和我們之前在學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)的時候類似,并且讀起代碼來也比較容易,這里需要說一下的是全連接層的建立,這里我們創(chuàng)建全連接層首先需要讀取到該層的維度信息列表,然后我們要改變特征圖的形狀,在第六層將得到的多維特征進(jìn)行拉伸操作,使其符合全連接層的輸入即可,這里的shape中有元素[-1],表示將該維度打平到一維,實現(xiàn)降維的目的.
這一部分代碼是實現(xiàn)前向傳播的關(guān)鍵代碼,這一部分代碼實現(xiàn)了VGG16的所有結(jié)構(gòu),還記得我們剛開始所說的VGG_MEAN中要將圖像處理為BGR,現(xiàn)在我們GBR當(dāng)中的每個元素相減VGG_MEAN當(dāng)中的元素,這樣圖片就由GBR改為BGR
VGG16的各層參數(shù)可以參考下圖所示
2:untils.py
這一部分主要是實現(xiàn)了輸入的圖像處理,并且展現(xiàn)出來,主要的思路是將圖像歸一化后進(jìn)行處理,實現(xiàn)結(jié)果如下圖所示:
3:app.py
在這一部分,我們要做的是調(diào)用VGG16的網(wǎng)絡(luò)結(jié)構(gòu),然后計算概率,輸出概率最大的五種可能性,并且和標(biāo)簽一一對應(yīng),最后用柱狀圖畫下來,表達(dá)出結(jié)果.
接著上圖的測試,畫出柱狀圖來,如下:
三:測試
1:第一組
2:第二組
3:第三組(這個翻車了…..)