用 Pytorch 理解卷積網絡

來源:小白學視覺

在當今時代,機器在理解和識別圖像中的特征和目標方面已經成功實現了99%的精度。我們每天都會看到這種情況-智能手機可以識別相機中的面部;使用Google圖片搜索特定照片的能力;從條形碼或書籍中掃描文本。借助卷積神經網絡(CNN),這一切都是可能的,卷積神經網絡是一種特定類型的神經網絡,也稱為卷積網絡。

如果您是一名深度學習愛好者,那么您可能已經聽說過卷積神經網絡,也許您甚至自己開發了一些圖像分類器。像Tensorflow和PyTorch這樣的現代深度學習框架使向機器學習圖像變得容易,但是,仍然存在一些問題:數據如何通過神經網絡的人工層傳遞?計算機如何從中學習?更好地解釋卷積神經網絡的一種方法是使用PyTorch。因此,讓我們通過可視化每個圖層的圖像來深入研究CNN。


卷積神經網絡的解釋
什么是卷積神經網絡?
卷積神經網絡(CNN)是一種特殊類型的神經網絡,在圖像上表現特別出色。卷積神經網絡由Yan LeCun在1998年提出,可以識別給定輸入圖像中存在的數字。

在開始使用卷積神經網絡之前,了解神經網絡的工作原理很重要。神經網絡模仿人腦如何解決復雜的問題并在給定的數據集中找到模式。在過去的幾年中,神經網絡席卷了許多機器學習和計算機視覺算法。

神經網絡的基本模型由組織在不同層中的神經元組成。每個神經網絡都有一個輸入層和一個輸出層,并根據問題的復雜性增加了許多隱藏層。一旦數據通過這些層,神經元就會學習并識別模式。神經網絡的這種表示稱為模型。訓練完模型后,我們要求網絡根據測試數據進行預測。如果您不熟悉神經網絡,那么這篇有關使用Python進行深度學習的文章就是一個很好的起點。
另一方面,CNN是一種特殊的神經網絡,在圖像上表現特別出色。卷積神經網絡由Yan LeCun在1998年提出,可以識別給定輸入圖像中存在的數字。使用CNN的其他應用程序包括語音識別,圖像分割和文本處理。在卷積神經網絡之前,多層感知器(MLP)用于構建圖像分類器。

圖像分類是指從多波段光柵圖像中提取信息類別的任務。多層感知器需要更多的時間和空間來在圖片中查找信息,因為每個輸入功能都需要與下一層的每個神經元相連。CNN通過使用稱為本地連接的概念取代了MLP,該概念涉及將每個神經元僅連接到輸入體積的本地區域。通過允許網絡的不同部分專門處理高級功能(如紋理或重復圖案),可以最大程度地減少參數數量。感到困惑?別擔心。讓我們比較一下圖像如何通過多層感知器和卷積神經網絡進行傳遞的,以更好地理解。


比較MLPS和CNNS
考慮到MNIST數據集,由于輸入圖像的大小為28x28 = 784,多層感知器輸入層的總數將為784。 網絡應該能夠預測給定輸入圖像中的數量,這意味著輸出可能屬于以下范圍中的任何一個,范圍從0到9(1、2、3、4、5、6、7、8、9 )。 在輸出層中,我們返回類別分數,例如,如果給定的輸入是具有數字“ 3”的圖像,則在輸出層中,對應的神經元“ 3”比其他神經元具有更高的類別分數。 我們需要包含多少個隱藏層,每個層中應該包含多少個神經元?這是一個編碼MLP的示例:

用 Pytorch 理解卷積網絡的圖1

上面的代碼段是使用稱為Keras的框架實現的(暫時忽略語法)。它告訴我們在第一個隱藏層中有512個神經元,它們連接到形狀為784的輸入層。該隱藏層之后是一個隨機失活層,該層克服了過擬合的問題。0.2表示在第一個隱藏層之后不考慮神經元的可能性為20%。再次,我們在第二個隱藏層中添加了與第一個隱藏層中相同數量的神經元(512),然后添加了另一個隨機失活。最后,我們用包含10個類的輸出層結束這組層。具有最高值的此類將是模型預測結果。

這是定義所有層之后的網絡多層外觀。這種多層感知器的一個缺點是全連接的以供網絡學習,這需要更多的時間和空間。MLP僅接受向量作為輸入。

用 Pytorch 理解卷積網絡的圖2

卷積層不使用全連接層,而是使用稀疏連接層,也就是說,它們接受矩陣作為輸入,這比MLP更具優勢。輸入特征連接到本地編碼節點。在MLP中,每個節點負責獲得對整個畫面的理解。在CNN中,我們將圖像分解為區域(像素的局部區域)。每個隱藏節點都必須輸出層報告,在輸出層,輸出層將接收到的數據組合起來以找到模式。下圖顯示了各層如何本地連接。

用 Pytorch 理解卷積網絡的圖3
在我們了解CNN如何在圖片中找到信息之前,我們需要了解如何提取特征。卷積神經網絡使用不同的圖層,每一層將保存圖像中的特征。例如,考慮一張狗的照片。每當網絡需要對狗進行分類時,它都應該識別所有特征-眼睛,耳朵,舌頭,腿等。使用過濾器和核,這些特征被分解并在網絡的局部層中識別出來。

計算機如何看圖像?

與人類通過用眼睛了解圖像的計算機不同,計算機使用一組介于0到255之間的像素值來了解圖片。計算機查看這些像素值并理解它們。乍一看,它不知道物體或顏色,只識別像素值,這就是圖像用于計算機的全部。

在分析像素值之后,計算機會慢慢開始了解圖像是灰度還是彩色。它知道差異,因為灰度圖像只有一個通道,因為每個像素代表一種顏色的強度。零表示黑色,255表示白色,黑色和白色的其他變化形式,即介于兩者之間的灰色。另一方面,彩色圖像具有三個通道-紅色,綠色和藍色。它們代表三種顏色(3D矩陣)的強度,并且當值同時變化時,它會產生大量的顏色!確定顏色屬性后,計算機會識別圖像中對象的曲線和輪廓。

可以使用PyTorch在卷積神經網絡中探索此過程,以加載數據集并將濾波器應用于圖像。下面是代碼片段。(在GitHub上可找到此代碼)

用 Pytorch 理解卷積網絡的圖4

用 Pytorch 理解卷積網絡的圖5

現在,讓我們看看如何將單個圖像輸入神經網絡。

(在GitHub上可找到此代碼)

img = np.squeeze(images[7])fig = plt.figure(figsize = (12,12)) ax = fig.add_subplot(111)ax.imshow(img, cmap='gray')width, height = img.shapethresh = img.max()/2.5for x in range(width):    for y in range(height):        val = round(img[x][y],2) if img[x][y] !=0 else 0        ax.annotate(str(val), xy=(y,x),            color='white' if img[x][y]<thresh else 'black')
用 Pytorch 理解卷積網絡的圖6  

這就是將數字“ 3”分解為像素的方式。從一組手寫數字中,隨機選擇“ 3”,其中顯示像素值。在這里,ToTensor()歸一化實際像素值(0–255)并將其限制為0到1。為什么?因為,這使得以后的部分中的計算更加容易,無論是在解釋圖像還是找到圖像中存在的通用模式。


建立自己的濾波器
在卷積神經網絡中,圖像中的像素信息被過濾。為什么我們完全需要濾波器?就像孩子一樣,計算機需要經歷了解圖像的學習過程。值得慶幸的是,這不需要幾年的時間!計算機通過從頭開始學習,然后逐步進行到整體來完成此任務。因此,網絡必須首先知道圖像中的所有原始部分,例如邊緣,輪廓和其他低層特征。一旦檢測到這些,計算機便可以處理更復雜的功能。簡而言之,必須先提取低級功能,然后再提取中級功能,然后再提取高級功能。濾波器提供了一種提取信息的方法。
可以使用特定的濾波器提取低級特征,該濾波器也是類似于圖像的一組像素值??梢岳斫鉃檫B接CNN中各層的權重。將這些權重或濾波器與輸入相乘,得出中間圖像,中間圖像表示計算機對圖像的部分理解。然后,這些副產品再與更多的濾波器相乘以擴展視圖。該過程以及對功能的檢測一直持續到計算機了解其外觀為止。
您可以根據自己的需要使用很多濾波器。您可能需要模糊,銳化,加深,進行邊緣檢測等-都是濾波器。
讓我們看一些代碼片段,以了解濾波器的功能。

用 Pytorch 理解卷積網絡的圖7

用 Pytorch 理解卷積網絡的圖8

用 Pytorch 理解卷積網絡的圖9

用 Pytorch 理解卷積網絡的圖10

這是應用濾波器后圖像的外觀。在這種情況下,我們使用了Sobel 濾波器 。

完整的卷積神經網絡(CNNS)

我們已經知道濾波器是如何從圖像中提出特征了,但是為了完成整個卷積神經網絡我們需要理解用來設計CNN的各層。

卷積神經網絡中的各層分別叫做:
  • 卷積層
  • 池化層
  • 全連接層

使用這3層,可以構造類似這樣的圖像分類器:

用 Pytorch 理解卷積網絡的圖11

CNN各層的作用

現在讓我們一起來看看各層是用來干什么的

卷積層——卷積層(CONV)使用過濾器執行卷積操作,同時掃描輸入圖像的尺寸。它的超參數包括濾波器尺寸,通常設置為2x2,3x3,4x4,5x5(但并不僅限于這些尺寸),步長(S)。輸出結果(O)被稱為特征圖或激活圖,包含了輸入層和濾波器計算出的所有特性。下圖描述了應用卷積時產生的特征圖:

用 Pytorch 理解卷積網絡的圖12

卷積操作

池化層——池化層(POOL)用于特征的降采樣,通常在卷積層之后應用 。常見的兩種池化操作為最大池化和平均池化,分別求取特征的最大值和平均值。下圖描述了池化的基本原理:

用 Pytorch 理解卷積網絡的圖13

最大池化

用 Pytorch 理解卷積網絡的圖14

平均池化

全連接層——全連接層(FC)作用于一個扁平的輸入,其中每個輸入都連接到所有的神經元 。全連接層通常用于網絡的末端,將隱藏層連接到輸出層,這有助于優化類分數。 

用 Pytorch 理解卷積網絡的圖15

全連接層

在Pytorch可視化CNN

我們對CNN的函數有了更好的了解,現在讓我們使用Facebook的PyTorch框架來實現它。

步驟1:加載輸入圖像。我們將使用Numpy和OpenCV。(在GitHub上可找到代碼)

用 Pytorch 理解卷積網絡的圖16  

用 Pytorch 理解卷積網絡的圖17  

步驟2:可視化濾波器,以更好地了解我們將使用的濾波器。(在GitHub上可找到代碼)

用 Pytorch 理解卷積網絡的圖18

用 Pytorch 理解卷積網絡的圖19

步驟3:定義卷積神經網絡。該CNN具有卷積層和最大池化層,并且權重使用上述濾波器進行初始化:(在GitHub上可找到代碼)

用 Pytorch 理解卷積網絡的圖20

用 Pytorch 理解卷積網絡的圖21

步驟4:可視化濾波器??焖贋g覽一下正在使用的濾波器。(在GitHub上可找到代碼)

def viz_layer(layer, n_filters= 4):    fig = plt.figure(figsize=(20, 20))
   for i in range(n_filters):        ax = fig.add_subplot(1, n_filters, i+1)        ax.imshow(np.squeeze(layer[0,i].data.numpy()), cmap='gray')        ax.set_title('Output %s' % str(i+1))fig = plt.figure(figsize=(12, 6))fig.subplots_adjust(left=0, right=1.5, bottom=0.8, top=1, hspace=0.05, wspace=0.05)for i in range(4):    ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])    ax.imshow(filters[i], cmap='gray')    ax.set_title('Filter %s' % str(i+1))
gray_img_tensor = torch.from_numpy(gray_img).unsqueeze(0).unsqueeze(1)

濾波器:

用 Pytorch 理解卷積網絡的圖22

步驟5:跨層濾波器輸出。 在CONV和POOL層中輸出的圖像如下所示。

viz_layer(activated_layer)viz_layer(pooled_layer)
卷積層
用 Pytorch 理解卷積網絡的圖23
池化層

用 Pytorch 理解卷積網絡的圖24

參考:CS230 CNNs(https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-convolutional-neural-networks).


登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

3
3
2