1. 程式人生 > >卷積神經網路入門一種全卷積神經網路(LeNet),從左至右依次為卷積→子取樣→卷積→子取樣→全連線→全連線→高斯連線測試 最後,為了檢驗 CNN 能否工作,我們準備不同的另一組圖片與標記集(不能在訓練

卷積神經網路入門一種全卷積神經網路(LeNet),從左至右依次為卷積→子取樣→卷積→子取樣→全連線→全連線→高斯連線測試 最後,為了檢驗 CNN 能否工作,我們準備不同的另一組圖片與標記集(不能在訓練

轉載來自:http://blog.csdn.net/maweifei/article/details/52443995

第一層——數學部分

CNN 的第一層通常是卷積層(Convolutional Layer)。輸入內容為一個 32 x 32 x 3 的畫素值陣列。現在,解釋卷積層的最佳方法是想象有一束手電筒光正從影象的左上角照過。假設手電筒光可以覆蓋 5 x 5 的區域,想象一下手電筒光照過輸入影象的所有區域。在機器學習術語中,這束手電筒被叫做過濾器(filter,也被稱為神經元(neuron)或核(kernel)),被照過的區域被稱為感受野(receptive field)。過濾器同樣也是一個數組(其中的數字被稱作權重或引數)。重點在於過濾器的深度必須與輸入內容的深度相同,因此過濾器大小為 5 x 5 x 3。現在,以過濾器所處在的第一個位置為例,即影象的左上角。當篩選值在影象上滑動(卷積運算)時,過濾器中的值會與影象中的原始畫素值相乘(又稱為計算點積)。這些乘積被加在一起(從數學上來說,一共會有 75 個乘積)。現在你得到了一個數字。切記,該數字只是表示過濾器位於圖片左上角的情況。我們在輸入內容上的每一位置重複該過程。(下一步將是將過濾器右移 1 單元,接著再右移 1 單元,以此類推。)輸入內容上的每一特定位置都會產生一個數字。過濾器滑過所有位置後將得到一個 28 x 28 x 1(32-5+1)
的陣列,我們稱之為啟用對映(activation map)或特徵對映(feature map)。之所以得到一個 28 x 28 的陣列的原因在於,在一張 32 x 32 的輸入影象上,5 x 5 的過濾器能夠覆蓋到 784 個不同的位置。這 784 個位置可對映為一個 28 x 28 的陣列。


(注意:包括上圖在內的一些圖片來自於 Micheal Nielsen 的 「神經網路與深度學習( Neural Networks and Deep Learning)」一書。我強烈推薦這本書。這本書可免費線上瀏覽.)當我們使用兩個而不是一個 5 x 5 x 3 的過濾器時,輸出總量將會變成  28 x 28 x 2。採用的過濾器越多,空間維度( spatial dimensions)保留得也就越好。數學上而言,這就是卷積層上發生的事情。


第一層——高層次角度

不過,從高層次角度而言卷積是如何工作的?每個過濾器可以被看成是特徵識別符號( feature identifiers)。這裡的特徵指的是例如直邊緣、原色、曲線之類的東西。想一想所有影象都共有的一些最簡單的特徵。假設第一組過濾器是 7 x 7 x 3 的曲線檢測器。(在這一節,為了易於分析,暫且忽略該過濾器的深度為 3 個單元,只考慮過濾器和影象的頂層層面。)作為曲線過濾器,它將有一個畫素結構,在曲線形狀旁時會產生更高的數值(切記,我們所討論的過濾器不過是一組數值!)


左圖:過濾器的畫素表示;右圖:曲線檢測器過濾器的視覺化;對比兩圖可以看到數值和形狀的對應

回到數學角度來看這一過程。當我們將過濾器置於輸入內容的左上角時,它將計算過濾器和這一區域畫素值之間的點積。拿一張需要分類的照片為例,將過濾器放在它的左上角。


左圖:原始影象;右圖:影象上過濾器的視覺化

切記,我們要做的是將過濾器與影象的原始畫素值相乘。


左圖:感受野的視覺化;右圖:感受野的畫素表示 * 過濾器的畫素表示

簡單來說,如果輸入影象上某個形狀看起來很像過濾器表示的曲線,那麼所有點積加在一起將會得出一個很大的值!讓我們看看移動過濾器時會發生什麼。



這個值小了很多!這是因為影象的這一部分和曲線檢測器過濾器不存在對應。記住,這個卷積層的輸出是一個啟用對映(activation map)。因此,在這個帶有一個過濾器卷積的例子裡(當篩選值為曲線檢測器),啟用對映將會顯示出影象裡最像曲線的區域。在該例子中,28 x 28 x 1 的啟用對映的左上角的值為 6600。高數值意味著很有可能是輸入內容中的曲線激活了過濾器。啟用地圖右上角的值將會是 0,因為輸入內容中沒有任何東西能啟用過濾器(更簡單地說,原始圖片中的這一區域沒有任何曲線)。這僅僅是一組檢測右彎曲線的過濾器。還有其它檢測左彎曲線或直線邊緣的過濾器。過濾器越多,啟用對映的深度越大,我們對輸入內容的瞭解也就越多。

宣告:我在本小節中描繪的過濾器(filter)只是為了描述卷積中的數學過程。在下圖中你可以看到訓練後的網路中第一個卷積層的過濾器的實際視覺化。儘管如此,主要觀點仍舊不變。當在輸入內容中尋找特定特徵時,第一層上的過濾器在輸入影象上進行卷積運算和「啟用」(即計算高數值)。

上圖來自於斯坦福大學由 Andrej Karpathy 和 Justin Johnson 授課的 CS 231N課程,推薦給渴望更深層理解 CNN 的人們。

網路中的更深處

在傳統卷積神經網路架構中,卷積層之間還有其它型別的層。我強烈建議有興趣的人閱讀和它們有關的材料,並理解相應的功能和作用;但總的來說,它們提供的非線性和維度保留有助於提高網路的穩健性(robustness)並控制過擬合。一個典型的 CNN 結構看起來是這樣的:


輸入→卷積→ReLU→卷積→ReLU→池化→ReLU→卷積→ReLU→池化→全連線

我們稍後再來討論關鍵的最後一層,先回顧一下學到了哪些。我們討論了過濾器是如何在第一個卷積層檢測特徵的。它們檢測邊緣和曲線一類的低階特徵。正如想象的那樣,為了預測出圖片內容的分類,網路需要識別更高階的特徵,例如手、爪子與耳朵的區別。第一個卷積層的輸出將會是一個 28 x 28 x 3 的陣列(假設我們採用三個 5 x 5 x 3 的過濾器)。當我們進入另一卷積層時,第一個卷積層的輸出便是第二個卷積層的輸入。解釋這一點有些困難。第一層的輸入是原始影象,而第二卷積層的輸入正是第一層輸出的啟用對映。也就是說,這一層的輸入大體描繪了低階特徵在原始圖片中的位置。在此基礎上再採用一組過濾器(讓它通過第 2 個卷積層),輸出將是表示了更高階的特徵的啟用對映。這類特徵可以是半圓(曲線和直線的組合)或四邊形(幾條直線的組合)。隨著進入網路越深和經過更多卷積層後,你將得到更為複雜特徵的啟用對映。在網路的最後,可能會有一些過濾器會在看到手寫筆跡或粉紅物體等時啟用。如果你想知道更多關於視覺化卷積網路中過濾器的內容,可以檢視 Matt Zeiler 和 Rob Fergus 的一篇討論該問題的頗為傑出的研究論文。在 YouTube 上,Jason Yosinski 有一段視訊十分視覺化地呈現了這一過程(如下)。有趣的是,越深入網路,過濾器的感受野越大,意味著它們能夠處理更大範圍的原始輸入內容(或者說它們可以對更大區域的畫素空間產生反應)。

完全連線層

檢測高階特徵之後,網路最後的完全連線層就更是錦上添花了。簡單地說,這一層處理輸入內容(該輸入可能是卷積層、ReLU 層或是池化層的輸出)後會輸出一個 N 維向量,N 是該程式必須選擇的分類數量。例如,如果你想得到一個數字分類程式,如果有 10  個數字,N 就等於 10。這個 N 維向量中的每一數字都代表某一特定類別的概率。例如,如果某一數字分類程式的結果向量是 [0 .1 .1 .75 0 0 0 0 0 .05],則代表該圖片有 10% 的概率是 1、10% 的概率是 2、75% 的概率是 3、還有 5% 的概率是 9(注:還有其他表現輸出的方式,這裡只展示了 softmax 的方法)。完全連線層觀察上一層的輸出(其表示了更高階特徵的啟用對映)並確定這些特徵與哪一分類最為吻合。例如,如果該程式預測某一影象的內容為狗,那麼啟用對映中的高數值便會代表一些爪子或四條腿之類的高階特徵。同樣地,如果程式測定某一圖片的內容為鳥,啟用對映中的高數值便會代表諸如翅膀或鳥喙之類的高階特徵。大體上來說,完全連線層觀察高階特徵和哪一分類最為吻合和擁有怎樣的特定權重,因此當計算出權重與先前層之間的點積後,你將得到不同分類的正確概率。


一種全卷積神經網路(LeNet),從左至右依次為卷積→子取樣→卷積→子取樣→全連線→全連線→高斯連線

訓練(也就是:什麼能讓其有效)

下面是神經網路中的一個我尚未提及但卻最為重要的部分。閱讀過程中你可能會提出許多問題。第一卷積層中的濾波器是如何知道尋找邊緣與曲線的?完全連線層怎麼知道觀察哪些啟用圖?每一層級的濾波器如何知道需要哪些值?計算機通過一個名為反向傳播的訓練過程來調整過濾器值(或權重)。

在探討反向傳播之前,我們首先必須回顧一下神經網路工作起來需要什麼。在我們剛出生的時候,大腦一無所知。我們不曉得貓啊狗啊鳥啊都是些什麼東西。與之類似的是 CNN 剛開始的時候,權重或過濾器值都是隨機的。濾波器不知道要去尋找邊緣和曲線。更高層的過濾器值也不知道要去尋找爪子和鳥喙。不過隨著年歲的增長,父母和老師向我們介紹各式各樣的圖片並且一一作出標記。CNN 經歷的便是一個介紹圖片與分類標記的訓練過程。在深入探討之前,先設定一個訓練集,在這裡有上千張狗、貓、鳥的圖片,每一張都依照內容被標記。下面回到反向傳播的問題上來。

反向傳播可分為四部分,分別是前向傳導、損失函式、後向傳導,以及權重更新。在前向傳導中,選擇一張 32×32×3 的陣列訓練影象並讓它通過整個網路。在第一個訓練樣例上,由於所有的權重或者過濾器值都是隨機初始化的,輸出可能會是 [.1 .1 .1 .1 .1 .1 .1 .1 .1 .1],即一個不偏向任何數字的輸出。一個有著這樣權重的網路無法尋找低階特徵,或者說是不能做出任何合理的分類。接下來是反向傳播的損失函式部分。切記我們現在使用的是既有影象又有標記的訓練資料。假設輸入的第一張訓練圖片為 3,標籤將會是 [0 0 0 1 0 0 0 0 0 0]。損失函式有許多種定義方法,常見的一種是 MSE (均方誤差)。


假設變數 L 等同該數值。正如所料,前兩張訓練圖片的損失將會極高。現在,我們直觀地想一下。我們想要預測標記(卷積網路的輸出)與訓練標記相同(意味著網路預測正確)。為了做到這一點,我們想要將損失數量最小化。將其視為微積分優化問題的話,也就是說我們想要找出是哪部分輸入(例子中的權重)直接導致了網路的損失(或錯誤)。


這是一個 dL/dW 的數學等式,W 是特定層級的權重。我們接下來要做的是在網路中進行後向傳導,測定出是哪部分權重導致了最大的損失,尋找調整方法並減少損失。一旦計算出該導數,將進行最後一步也就是權重更新。所有的過濾器的權重將會更新,以便它們順著梯度方向改變。


學習速率是一個由程式設計師決定的引數。高學習速率意味著權重更新的動作更大,因此可能該模式將花費更少的時間收斂到最優權重。然而,學習速率過高會導致跳動過大,不夠準確以致於達不到最優點。


總的來說,前向傳導、損失函式、後向傳導、以及引數更新被稱為一個學習週期。對每一訓練圖片,程式將重複固定數目的週期過程。一旦完成了最後訓練樣本上的引數更新,網路有望得到足夠好的訓練,以便層級中的權重得到正確調整。

測試

最後,為了檢驗 CNN 能否工作,我們準備不同的另一組圖片與標記集(不能在訓練和測試中使用相同的!)並讓它們通過這個 CNN。我們將輸出與實際情況(ground truth )相比較,看看網路是否有效!


相關推薦

卷積神經網路入門一種全卷積神經網路(LeNet),從左至右依次為卷積子取樣卷積子取樣全連線全連線→高斯連線測試 最後為了檢驗 CNN 能否工作我們準備不同的另組圖片與標記集不能在訓練

轉載來自:http://blog.csdn.net/maweifei/article/details/52443995 第一層——數學部分 CNN 的第一層通常是卷積層(Convolutional Layer)。輸入內容為一個 32 x 32 x 3 的畫素值陣列。現在

矩陣找數--一個m*n的矩陣上到下都是遞增的個數x判斷x是否在矩陣中。要求效率儘可能的

思路一:迴圈找 效率差 思路二: 因為從左到右從上到下都是遞增的。 所以用數字和右上角的數字比較 如果要找的數字是7,則數字先與9比。比9小說明在9的左側。 再與8比,比8小,說明在8的左側。 與2比,比2大,在2的下側。 比4大,在4的下側

鼠標移到某個地方時劃出條線的動畫

spl near webkit forward line for solid linear clas .line { border-bottom: 2px solid #E40012; width:0px; display: inline-bloc

java實現計算器最低版1.0只能實現依次計算——初學者入門

軟體:eclipse 才開始用java設計東西,我覺得這個程式適用於初步想設計計算器的同學用,雖然很簡單,但我會慢慢更新自己所寫計算器,實現更強的邏輯。 例如:61-7*4=216(從左至右的簡單邏輯,還不完善) 程式碼:(有詳細註釋) //大佬不適合看! package l

一個m*n的矩陣上到下都是遞增的個數x判斷x是否在矩陣中。高效率

這樣的矩陣可以使用一個二維陣列儲存,知道了矩陣的特點,選取一個元素時可以將矩陣分割槽 可以看到隨意選一個元素的話會分成四個區域,陰影部分是可能的區域,深色的是確定比要查詢的大或者小,淺色陰影是有可能,所以下一步的動作很難確定,因此,隨意取一個點進行比較然後

上往下打印出二叉樹的每個節點同層節點列印。

import java.util.ArrayList; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int

如何讓同一行上的三個DIV排列

<html>    <head>        <title>CSS</title>    </head>    <style type="text/css" rel="stylesheet">...        * {...}{   

利用語音深度神經網路進行語音識別的新方案

A NOVEL SCHEME FOR SPEAKER RECOGNITION USING A PHONETICALLY-AWARE DEEP NEURAL NETWORK Yun Lei Nicolas Scheffer Luciana Ferrer Mitchell McLaren 美國加

深度學習R1零開始建立完全連線神經網路

作者:PENG ZHAO 我要感謝Feiwen, Neil和所有其他的技術評論家和讀者,他們為本文提出了寶貴的意見和建議。 背景 深度神經網路(DNN)近年來取得了在影象識別、自然語言處理和自動駕駛領域取得了巨大成就,如圖1所示,從2012至2015

深度學習入門專案完整流程——圖片製作資料訓練網路測試準確率TensorFlow+keras

首先將訓練的圖片和標籤製作成資料集,我用的是numpy庫裡的savez函式,可以將numpy陣列儲存為.npz檔案(無壓縮,所以檔案較大)。 import cv2 as cv import numpy as np import os import glob #調整影象的大小、製作資

服務可持續的網路功能延服務功能鏈遷移的動態資源分配方法

寫在前面,本文為 Autonomic resource arbitration and service-continuable network function migration along service function chain 學習筆記,為對NFV感

2018-3-20論文新型的智慧演算法-狼群演算法WPA筆記二狼群系統分析演算法步驟

狼群系統分工:頭狼: 狼群中最有智慧以及最凶猛的。它不斷的根據狼群所感知的資訊進行決策,身份:行動的指揮者探狼:負責偵查資訊,感知獵物的氣味。在進行實物搜尋的階段,會派出一些探狼(只是一小部分)去偵測資訊,他們會根據偵測到的資訊進行自主決策,向著獵物氣味最近的方向前進。猛狼:

基於類區塊鏈網路的抽獎的簡單構思

前段時間的一元抽獎鬧得沸沸揚揚,近來差不多已經銷聲匿跡了。背後的原因不言自明,國家政策是一方面,但我想更多的還是因為這種抽獎後臺操縱的空間太大。最近翻舊聞時又翻到了批判一元奪寶的文章,為人性的貪婪感嘆之餘,想到如果是我做這樣的東西的話,會怎樣實現一個靠譜點的方案,要求是過程可

如果系統要使用超大整數超過long長度範圍請你設計個數據結構來儲存這種超大型數字以及設計演算法來實現超大整數加法運算

/**     * 超大整數相加:     * 題目要求:如果系統要使用超大整數(超過long的範圍),請你設計一個數據結構來儲存這種     * 超大型數字以及設計一種演算法來實現超大整數的加法運算     * @author Administrator     *     */      p

題目描述 在一個二維數組中每個維數組的長度相同),每一行都按照從左遞增的順序排序列都按照上到下遞增的順序排序。請完成一個函數輸入這樣的一個二維數組和一個整數判斷數組中是否含有該整數。

這樣的 -i 一個 整數 描述 輸入 遞增 lse i+1 題目描述 在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 1

hibernate 級聯刪除時候的兩情況 之 刪除無法刪除關係表

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

在Ubuntu安裝和使用Anbox完整說明在Linux使用Android應用的方法

在Ubuntu安裝和使用Anbox完整說明(一種在Linux使用Android應用的方法) Anbox是一種基於容器的方法,用於在常規GNU/Linux系統 https://anbox.io上啟動完整的Android系統,相似但不同的專案還有Shashlik和Genimob

劍指off:在一個二維陣列中每個維陣列的長度相同),每一行都按照從左遞增的順序排序列都按照上到下遞增的順序排序。請完成一個函式輸入這樣一個二維陣列和一個整數判斷陣列中是否含有該整數

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 思路: 從左下角x開始尋找,x為此列最大數字,此行最小數字。如果目