當前位置:
首頁 > 知識 > 卷積神經網路 詳解及資料整理

卷積神經網路 詳解及資料整理

本文為 AI 研習社編譯的技術博客,原標題Convolutional Neural Network (CNN)。

翻譯 | 老趙 校對 | 江舟 整理 | 志豪

https://skymind.ai/wiki/convolutional-network#intro


內容

深度神經網路介紹

圖像是4維張量嗎?

卷積神經網路定義

深度神經網路如何工作?

池化/下採樣

展示代碼

更多卷積神經網路資料


深度神經網路介紹

卷積神經網路是深度人工神經網路,主要用於圖像分類(比如,對你看到的進行命名),通過相似度聚類(圖像搜索),並在場景中執行對象識別。 它們是可以識別面部,個體,街道標誌,腫瘤,鴨嘴獸和視覺數據的許多其他方面的演算法。

卷積網路使用光學字元識別(OCR)進行數字化文本,並使模擬和手寫文檔上的自然語言處理成為可能,其中圖像是要轉錄的符號。 當聲音被可視化為頻譜圖時,CNN也可以應用於聲音。 最近,卷積網路已經直接應用於文本分析以及具有圖像卷積網路的圖像數據。

卷積網路(ConvNets或CNN)在圖像識別中的效果是世界廣泛使用深度學習功能的主要原因之一。 它們推動了計算機視覺(CV)的重大進步,它在自動駕駛汽車,機器人,無人機,安全,醫療診斷以及視障人士的治療方面具有明顯的應用。


圖像是4維張量嗎?

卷積神經網路使用張量輸入和處理圖像,張量是具有附加維度的數字矩陣。

它們很難被可視化,所以讓我們通過類比來理解它們。 標量只是一個數字,例如7; 向量是一個數字列表(例如,[7,8,9]);矩陣是一個矩形的數字網格,佔用多個行和列,就像電子表格一樣。 幾何上,如果標量是零維的點,則矢量是一維的線,矩陣是二維平面,一堆矩陣排列在一起則是三維立方體,當這些矩陣的每個元素都有一堆映射到它的特徵時,你就得到了第四個維度。 作為參考,這是一個2 x 2矩陣:

[1,2] [5,8]

張量包含超出該二維平面的尺寸。 你可以將數字排列在一個立方體中,就會輕鬆地畫出一個三維張量。 這是一個以平坦方式呈現的2 x 3 x 2張量(它畫出了每個沿z軸延伸的2元數組的底部元素,直觀地理解為什麼它被稱為三維數組):

在代碼中,上面的張量會被寫成這樣:[ [ [2,3], [3,5], [4,7] ], [ [3,4], [4,6], [5,8] ] ]。可視化為:

換句話說,張量是由嵌套在數組中的數組形成的,並且可以進行無限嵌套,任意數量的維數遠遠大於我們在空間上可以看到的維數。 四維張量可以用嵌套一層更深的數組來簡單替換這些標量中的每一個。 卷積網路處理4維張量,如下所示(注意嵌套數組)。

ND4J 和 Deeplearning4j 使用:

NDArray

它與張量或多維數組具有相同意思。 張量的維數:

(1,2,3...n)

稱為張量的階數;即五階張量將具有五個維度。

圖像的寬度和高度很容易理解。 由於顏色的編碼方式,深度是必要的。 例如,紅綠藍(RGB)編碼產生三層深的圖像。 每一層都被稱為「通道」,通過卷積,它產生一堆特徵映射(下面將解釋),它存在於第四維,就在時間本身的維度上。 (特徵只是圖像的細節,如直線或曲線,卷積網路為其創建映射)。

因此,在卷積網中,圖像不被視為二維區域,而被視為四維物體。 下面將更全面地探討這些想法。


卷積定義

從拉丁語convolvere來看,「to convolve」意味著一起滾動。 出於數學目的,卷積是測量兩個函數重疊程度的積分。 將卷積視為通過將兩個函數相乘來混合兩個函數的方法。

圖片來源:Mathworld。 「綠色曲線是作為 t 的函數,表示藍色和紅色曲線的卷積,垂直綠線對應相應的x值。 灰色區域表示g(tau)f(t-tau)的積,它是 t 的函數,因此其作為t的函數的面積恰好是卷積。

看看站在圖表中間的高而窄的鐘形曲線。 積分是該曲線下的面積。 靠近它的是第二條鐘形曲線,它更短更寬,從圖的左側慢慢向右漂移。 這兩個函數在沿x軸的每個點處重疊的乘積是它們的卷積。 所以從某種意義上說,這兩個函數正在「融合在一起」。

通過圖像分析,靜態的基礎函數(相當於靜止的鐘形曲線)是被分析的輸入圖像,第二個移動函數被稱為濾波器,因為它拾取圖像中的信號或特徵。 這兩個函數通過乘法相關聯。 要將卷積可視化為矩陣而不是鐘形曲線,請參閱Andrej Karpathy在「Convolution Demo」中出色的動畫。

關於卷積網路的下一個要點是它們在單個圖像上通過了許多濾波器,每個濾波器都會拾取不同的信號。 在相當早期的一層,你可以將它們想像為通過水平線濾波器,垂直線濾波器和對角線濾波器來創建圖像中關於邊緣的圖。

卷積網路採用這些濾波器,圖像特徵空間的切片,並逐個映射它們; 也就是說,他們會創建一張地圖,顯示每個特徵出現的地方。 通過學習特徵空間的不同部分,卷積網路允許輕鬆擴展和健壯的特徵工程特性。

(請注意,卷積網以不同於RBMs的方式分析圖像。雖然RBMs學習重建和識別每個圖像的整體特徵,但卷積網學習我們稱之為特徵圖的圖像片段)

因此卷積網路執行某種搜索。 想像一下,一個小放大鏡從左向右滑過一個較大的圖像,一旦到達一個通道的末尾就會在左邊重新開始(就像打字機一樣)。 那個移動的窗口只能識別一件東西,比如一條短的垂直線。 三個暗像素堆疊在一起。 它在圖像的實際像素上移動垂直線識別過濾器,尋找匹配。

每次找到匹配時,它都會被映射到該視覺元素特有的特徵空間上。 在那個空間中,每個垂直線匹配的位置都會被記錄下來,有點像觀鳥者在地圖上留下大頭針來標記他們最後一次看到一隻巨大的藍鷺的位置。 卷積網路在單個圖像上運行許多次搜索 ——水平線,對角線,與要搜索的視覺元素一樣多。

卷積網路對輸入執行的操作比卷積本身要多。

在卷積層之後,輸入通過非線性變換(例如tanh或relu函數),將輸入值壓縮到介於-1和1之間的範圍內。


卷積神經網路是如何工作的?

關於卷積網路,首先要知道的是,它們不像人類那樣感知圖像。 因此,你必須以不同的方式思考圖像被饋送到卷積網路並由卷積網路處理時的含義。

卷積網路將圖像視為很多層卷; 比如三維物體,而不是僅通過寬度和高度來測量的平面畫布。 這是因為數字彩色圖像具有紅 - 藍 - 綠(RGB)編碼,混合這三種顏色以產生人類感知的色譜。 卷積網路將這些圖像輸入為三個獨立的顏色通道,一個層疊在另一個之上。

因此,卷積網路接收一個普通彩色圖像,就像一個矩形盒子,其寬度和高度由沿著這些維度的像素數量來測量,深度為三層,RGB中每個字母對應一層。這些深度層被稱為通道。

當圖像通過卷積網路時,我們將根據輸入卷和輸出捲來描述它們,在數學上將它們表示為這種形式的多維矩陣:30x30x3。 從一層到另一層,它們的尺寸會發生變化,原因將在下面解釋。

你需要密切關注圖像卷層每個維度的精確度量,因為它們是用於處理圖像的線性代數運算的基礎。

現在,對於圖像的每個像素,R,G和B的強度將由數字表示,該數字將是三個堆疊二維矩陣中的一個矩陣中的一個元素,這三個矩陣一起形成圖像卷層。

這些數字是輸入卷積網路的初始、原始、感官特徵,ConvNets的目的是找出這些數字中的哪一個是有助於更準確分類圖像的重要信號。 (就像我們討論過的其他前饋網路一樣)。

卷積網不是一次只關注一個像素,而是採用方形的像素塊並將它們傳遞給濾波器。 該濾波器也是比圖像本身小的正方形矩陣,大小與patch 相同。 它也被稱為內核,對於那些熟悉支持向量機的人來說,這將敲響警鐘,過濾器的工作是在像素中找到模式。

這部優秀動畫的功勞歸於Andrej Karpathy。

想像兩個矩陣。 一個是30x30,另一個是3x3。 也就是說,濾波器覆蓋一個圖像通道表面區域的百分之一。

我們將使用此圖像通道像素塊和濾波器的點積。 如果兩個矩陣在相同位置具有高的灰度值,則輸出的點積值也是高的。 否則,輸出就會產生很低的點積。 通過這種方式,單個值(輸出的點積)可以告訴我們底層圖像中的像素圖案是否與濾波器表示的像素圖案匹配。

讓我們假設濾波器表示一條水平線,第二行有高值,第一和第三行有低值。 現在想像我們從底層圖像的左上角開始,然後我們一步一步地將濾波器移過圖像,直到它到達右上角。 步長的大小稱為步幅。 你可以一次將濾波器移動一列,也可以選擇更大的步幅。

在每個步驟中,你取另一個點積,並將該點積的結果放在第三個被稱為激活圖矩陣中。 激活圖的寬度或列數等於濾波器遍歷底層圖像所用的步數。 由於更大的步幅導致更少的步驟,因此大步幅將產生更小的激活圖。 這一點很重要,因為卷積網路在每一層處理和產生的矩陣的大小與它們的計算成本以及它們需要多長時間訓練成正比。 更大的步幅意味著更少的時間和計算量。

濾波器最先疊加在前三行上並滑過它們,然後再次從同一圖像的第4 - 6行開始。如果它步幅為3,那麼它將產生一個10x10的點積矩陣。 表示水平線的相同濾波器可以應用於底層圖像R,G和B的所有三個通道。並且可以將三個10x10激活圖添加到一起,以便在所有三個通道上的水平線的聚合激活圖也是10x10。

現在,因為圖像在許多方向上都有線條,並且包含許多不同類型的形狀和像素模式,所以你需要在底層圖像上滑動其他濾波器以搜索這些模式。 例如,你可以在像素中查找96種不同的模式。 這96個模式將創建96個激活映射形成的堆棧,從而產生一個10x10x96的新卷。 在下圖中,我們重新標記了輸入圖像,內核和輸出激活圖。

我們剛剛描述的是卷積。 你可以將卷積視為信號處理中使用的一種奇特的乘法。 考慮創建兩個矩陣的點積的另一種方法是當做兩個函數。 圖像是底層函數,濾波器是你在底層函數上滾動的函數。

圖像的主要問題之一是它們是高維的,這意味著它們需要花費大量的時間和計算能力來處理。 卷積網路旨在以各種方式降低圖像的維度。 濾波器步幅是降低維度的一種方法。 另一種方式是通過下採樣。


CNNs進行最大池化/下採樣

卷積網路中的下一層有三個名稱:最大池化,下採樣和子採樣。 激活圖被饋送到下採樣層,並且像卷積一樣,該方法一次應用一個像素塊。 在這種情況下,最大池化只從圖像的一個像素塊中獲取最大值,將其放置在與其他像素塊的最大值相鄰的新矩陣中,並丟棄激活映射中包含的其餘信息。

圖片來源 Andrej Karpathy.

只有圖像上顯示與每個特徵相關性最強的位置(最大值)被保留下來,這些最大值組合在一起形成了一個低維空間。

在這一步中,許多關於較小价值的信息丟失了,這刺激了對替代方法的研究。 但是,下採樣具有優勢,正是因為信息丟失,減少了所需的存儲量和處理量。


交替層

下圖是展示典型卷積網路中涉及的變換序列的另一次嘗試。

從左到右,你會看到:

1. 掃描實際輸入圖像得到特徵。 淺色矩形是經過它的濾波器。

2. 激活圖堆疊在一起,每個激活圖使用一個過濾器。 較大的矩形是一個要下採樣的塊。

3. 通過下採樣壓縮的激活圖。

4. 通過在第一個下採樣堆上傳遞濾波器創建的一組新的激活映射圖。

5. 第二次下採樣,壓縮第二組激活映射圖。

6. 一個全連接層,對每個節點帶有一個標籤的輸出進行分類。

隨著越來越多的信息丟失,卷積網路處理的模式變得更加抽象,並且變得離我們人類識別的視覺模式越來越遠。 所以如果卷積網路在他們變得更深入時不能提供簡單的直覺感受,請原諒你自己和我們。


D4LJ代碼示例

以下是如何使用Deeplearning4j配置ConvNet的一個示例:

Create an iteratorusingthe batch sizeforone iteration

*/

log.info("Load data....");

DataSetIterator mnistTrain =newMnistDataSetIterator(batchSize,true,12345);

DataSetIterator mnistTest =newMnistDataSetIterator(batchSize,false,12345);

/*

Construct the neural network

*/

log.info("Build model....");

// learning rate schedule in the form of

Map lrSchedule =newHashMap();

lrSchedule.put(,0.01);

lrSchedule.put(1000,0.005);

lrSchedule.put(3000,0.001);

MultiLayerConfiguration conf =newNeuralNetConfiguration.Builder()

.seed(seed)

.l2(0.0005)

.weightInit(WeightInit.XAVIER)

.updater(newNesterovs(0.01,0.9))

.list()

.layer(,newConvolutionLayer.Builder(5,5)

//nIn and nOut specify depth. nIn here is the nChannels and nOut is the number of filters to be applied

.nIn(nChannels)

.stride(1,1)

.nOut(20)

.activation(Activation.IDENTITY)

.build())

.layer(1,newSubsamplingLayer.Builder(PoolingType.MAX)

.kernelSize(2,2)

.stride(2,2)

.build())

.layer(2,newConvolutionLayer.Builder(5,5)

//Note that nIn need not be specified in later layers

.stride(1,1)

.nOut(50)

.activation(Activation.IDENTITY)

.build())

.layer(3,newSubsamplingLayer.Builder(PoolingType.MAX)

.kernelSize(2,2)

.stride(2,2)

.build())

.layer(4,newDenseLayer.Builder().activation(Activation.RELU)

.nOut(500).build())

.layer(5,newOutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)

.nOut(outputNum)

.activation(Activation.SOFTMAX)

.build())

.setInputType(InputType.convolutionalFlat(28,28,1))//See note below

.backprop(true).pretrain(false).build();

/*

Regarding the .setInputType(InputType.convolutionalFlat(28,28,1)) line: This does a few things.

(a) It adds preprocessors, which handle things like the transition between the convolutional/subsampling layers

and the dense layer

(b) Does some additional configuration validation

(c) Where necessary, sets the nIn (number of input neurons, or input depth in the case of CNNs) values for each

layer based on the size of the previous layer (but it won"t override values manually set by the user)

InputTypes can be used with other layer types too (RNNs, MLPs etc) not just CNNs.

For normal images (when using ImageRecordReader) use InputType.convolutional(height,width,depth).

MNIST record reader is a special case, that outputs 28x28 pixel grayscale (nChannels=1) images, in a "flattened"

row vector format (i.e., 1x784 vectors), hence the "convolutionalFlat" input type used here.

*/

MultiLayerNetwork model =newMultiLayerNetwork(conf);

model.init();

log.info("Train model....");

model.setListeners(newScoreIterationListener(10));//Print score every 10 iterations

for(inti=; i

model.fit(mnistTrain);

log.info("*** Completed epoch {} ***", i);

log.info("Evaluate model....");

Evaluation eval = model.evaluate(mnistTest);

log.info(eval.stats());

mnistTest.reset();

}

log.info("****************Example finished********************");

}

這個要點由gist-it帶給你。 查看原始代碼 dl4j-examples / src / main / java / org / deeplearning4j / examples / convolution / LenetMnistExample.java

所有Deeplearning4j卷積網路示例都可在此處獲得。


其他資源

要查看DL4J卷積神經網路的運行情況,請按照快速入門頁面上的說明運行示例。

Skymind包含NVIDIA的cuDNN並與OpenCV集成。 我們的卷積網使用Spark在分散式GPU上運行,這使其成為世界上最快的網路之一。 你可以在此處了解如何使用VGG16構建圖像識別Web應用程序以及如何將CNN部署到Android上。

想要繼續查看該篇文章更多代碼、鏈接和參考文獻?

戳鏈接:http://www.gair.link/page/TextTranslation/1052


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

瀏覽器中的姿態檢測:PoseNet 模型
用PyTorch 0.4 實現的 YoloV3

TAG:AI研習社 |