1. 程式人生 > >視覺化探索卷積神經網路提取特徵

視覺化探索卷積神經網路提取特徵

前言

卷積神經網路的發展主要是為了解決人類視覺問題,不過現在其它方向也都會使用。發展歷程主要從Lenet5->Alexnet->VGG->GooLenet->ResNet等。

傳統神經網路

傳統BP神經網路層與層之間都是全連線的,對於影象處理領域,當神經網路處理大影象時,全連線會導致待訓練的引數非常龐大,比如100萬個畫素的影象,對於100個節點的隱層,則會產生億級別的引數,如果更多層及更多個節點那引數數量將會無比龐大。此外,傳統BP神經網路沒有假設相鄰影象之間存在緊密聯絡。綜上所述,BP神經網路不適合做影象處理。

卷積神經網路

為減少引數數量,首先想到可以構建部分連線的神經網路,每個神經元不再與上層所有神經元相連,而是連線某部分。另外還能通過權值共享來減少引數數量,一組連線共享權重而不必每個連線權重都不同。除此之外,還能通過池化來減少每層的樣本數,從而減少引數數量。結合以上特點,卷積神經網路就是這樣的一種網路。

看一個卷積神經網路示意圖,它包含了若干卷積層、池化層和全連線層。影象輸入經過第一層卷積層處理後,得到4層feature,為什麼可以是4層呢?其實就是可以自定義4個不同的filter對輸入分別運算,就得到4層feature。然後池化層對卷積後的feature進行池化處理,得到更小的feature,這裡運算後同樣是4層feature。接著繼續根據filter做卷積和池化處理,最後通過兩個全連線層完成輸出。

image

視覺化探索卷積網路

其實有時候我們很好奇圖片經過卷積神經網路的每個層後變成什麼樣子,想了解下這個過程發生了什麼變化,此時我們就可以使用一個工具——Quiver。它開源再github上,

https://github.com/keplr-io/quiver 。通過它可以很方便對卷及網路進行探索,以web瀏覽器形式實現對模型的視覺化,可以看到不同網路層的變化。

為方便起見,這裡直接建立VGG16模型例項。通過下面指令碼將下載VGG16模型的權重引數(這裡自動下載的是經過Imagenet訓練的模型引數,包含了1000個類別),權重引數總大小達到百兆位元組,然後模型被載入到記憶體中並建立一個監聽5000埠的服務。

import keras.applications as apps
from quiver_engine.server import launch

model = apps.vgg16.VGG16()
launch(model, input_folder="data")

訪問瀏覽器,選擇其中一個圖片作為輸入,左側為網路架構圖形,並且點選不同層可以看到不同的輸入。右側的圖片我們可以點選選擇,然後應用程式會自動將其作為輸入,模型再根據該輸入預測出可能性最高的五個結果。其中可以看到224x224的輸入,而且是3層,分別代表原始影象的紅、綠、藍。

image

然後選擇第一個卷積層,可以看到通過卷積核的操作後不同的特徵被突出,突出的特徵包括不同型別的邊緣、亮度和對比度等等。

image

繼續往下可以看到特徵越來越抽象,包含了不同的紋理、角度等等,還可能是眼睛和鼻子。

image

繼續往下到最後的卷積層時,此時的特徵已經抽象到我們人類已經無法理解了,對於我們來說,看到的特徵並沒有任何意義。最終通過完全連線層並得到包含了1000個元素的概率陣列,即對應ImageNet中每個類別的概率。

image

-------------推薦閱讀------------

我的開源專案彙總(機器&深度學習、NLP、網路IO、AIML、mysql協議、chatbot)

為什麼寫《Tomcat核心設計剖析》

我的2017文章彙總——機器學習篇

我的2017文章彙總——Java及中介軟體

我的2017文章彙總——深度學習篇

我的2017文章彙總——JDK原始碼篇

我的2017文章彙總——自然語言處理篇

我的2017文章彙總——Java併發篇


跟我交流,向我提問:

歡迎關注: