卷积神经网络、比较MLPS和CNNS、滤波器、CNN各层的作用、在Pytorch可视化CNN
1.33.卷積神經網絡
1.33.1.卷積 和 神經網絡
1.33.1.1.比較MLPS和CNNS
1.33.1.2.計算機如何看圖像?
1.33.1.3.建立自己的濾波器
1.33.2.完整的卷積神經網絡(CNNS)
1.33.2.1.CNN各層的作用
1.33.2.2.在Pytorch可視化CNN
1.33.卷積神經網絡
參考文章:
https://blog.csdn.net/kstheme/article/details/99689564
https://blog.csdn.net/zsd0819qwq/article/details/105396364
https://www.cnblogs.com/wangqinze/p/13508801.html
卷積神經網絡(CNN)是一種人工神經網絡結構,因為利用卷積神經網絡在圖像和語音識別方面能夠給出更優預測結果,這一技術也被廣泛的傳播可應用。卷積神經網絡最常被應用的方面是計算的圖像識別,不過因為不斷的創新,也被應用在視頻分析,自然語言處理,藥物發現,等等。
應用案例:
?智能手機可以識別相機中的面部。
?使用Google圖片搜索特定照片的能力。
?從條形碼或書籍中掃描文本。
1.33.1.卷積 和 神經網絡
什么是卷積神經網絡?我們可以把這個詞拆開成為“卷積”和“神經網絡”。
卷積也就是說神經網絡不再是對每個像素的輸入信息做處理了,而是圖片上每一小塊像素區域進行處理,這種做法加強了圖片信息的連續性。使得神經網絡能看到圖形,而非一個點。這種做法同時也加深了神經網絡對圖像的理解。每次收集的時候都只是收集一小塊像素區域,然后把收集來的信息進行整理,這時候整理出來的信息有了一些實際上的呈現。然后以同樣的步驟,用類似的批量過濾器掃過產生的這些邊緣信息,神經網絡從這些邊緣信息里面總結出更高層的信息結構。經過幾次過濾,最后我們把這些信息套入幾層普通的全連接神經層進行分類,這樣就能得到輸入的圖片能被分為哪一類的結果了。
神經網絡的基本模型由組織在不同層中的神經元組成。每個神經網絡都有一個輸入層和一個輸出層,并根據問題的復雜性增加了許多隱藏層。一旦數據通過這些層,神經元就會學習并識別模式。神經網絡的這種表示稱為模型。訓練完模型后,我們要求網絡根據測試數據進行預測。
卷積神經網絡(CNN)是一種特殊類型的神經網絡,在圖像上表現特別出色。卷積神經網絡由Yan LeCun在1998年提出,可以識別給定輸入圖像中存在的數字。使用CNN的其他應用程序包括語音識別,圖像分割和文本處理。在卷積神經網絡之前,多層感知器(MLP)用于構建圖像分類器。
圖像分類是指從多波段光柵圖像中提取信息類別的任務。多層感知器需要更多的時間和空間來在圖片中查找信息,因為每個輸入功能都需要與下一層的每個神經元相連。CNN通過使用稱為本地連接的概念取代了MLP,該概念涉及將每個神經元僅連接到到輸入體積的本地區域。通過允許網絡的不同部分專門處理高級功能(如紋理或重復圖案),可以最大程度地減少參數數量。
1.33.1.1.比較MLPS和CNNS
考慮到MNIST數據集,由于輸入圖像的大小為28x28 = 784,多層感知器輸入層的總數將為784。 網絡應該能夠預測給定輸入圖像中的數量,這意味著輸出可能屬于以下范圍中的任何一個,范圍從0到9(1、2、3、4、5、6、7、8、9 )。 在輸出層中,我們返回類別分數,例如,如果給定的輸入是具有數字“ 3”的圖像,則在輸出層中,對應的神經元“ 3”比其他神經元具有更高的類別分數。 我們需要包含多少個隱藏層,每個層中應該包含多少個神經元?這是一個編碼MLP的示例:
上面的代碼段是使用稱為Keras的框架實現的(暫時忽略語法)。它告訴我們在第一個隱藏層中有512個神經元,它們連接到形狀為784的輸入層。該隱藏層之后是一個隨機失活層,該層克服了過擬合的問題。0.2表示在第一個隱藏層之后不考慮神經元的可能性為20%。再次,我們在第二個隱藏層中添加了與第一個隱藏層中相同數量的神經元(512),然后添加了另一個隨機失活。最后,我們用包含10個類的輸出層結束這組層。具有最高值的此類將是模型預測結果。
這是定義所有層之后的網絡多層外觀。這種多層感知器的一個缺點是全連接的以供網絡學習,這需要更多的時間和空間。MLP僅接受向量作為輸入。
卷積層不使用全連接層,而是使用稀疏連接層,也就是說,它們接受矩陣作為輸入,這比MLP更具優勢。輸入特征連接到本地編碼節點。在MLP中,每次節點負責獲得對整個畫面的理解。在CNN中,我們將圖像分解為區域(像素的局部區域)。每個隱藏節點都必須輸出層報告,在輸出層,輸出層將接收到的數據組合起來以找到模式
在我們了解CNN如何在圖片中找到信息之前,我們需要了解如何提取特征。卷積神經網絡使用不同的圖層,每一層將保存圖像中的特征。例如,考慮一張狗的照片。每當網絡需要對狗進行分類時,它都應該識別所有特征-眼睛,耳朵,舌頭,腿等。使用過濾器和核,這些特征被分解并在網絡的局部層中識別出來。
1.33.1.2.計算機如何看圖像?
與人類通過用眼睛了解圖像的計算機不同,計算機使用一組介于0到255之間的像素值來了解圖片。計算機查看這些像素值并理解它們。乍一看,它不知道物體或顏色,只識別像素值,這就是圖像用于計算機的全部。
在分析像素值之后,計算機會慢慢開始了解圖像是灰度還是彩色。它知道差異,因為灰度圖像只有一個通道,因為每個像素代表一種顏色的強度。零表示黑色,255表示白色,黑色和白色的其他變化形式,即介于兩者之間的灰色。另一方面,彩色圖像具有三個通道-紅色,綠色和藍色。它們代表三種顏色(3D矩陣)的強度,并且當值同時變化時,它會產生大量的顏色!確定顏色屬性后,計算機會識別圖像中對象的曲線和輪廓。
可以使用PyTorch在卷積神經網絡中探索此過程,以加載數據集并將濾波器應用于圖像。下面是代碼片段。(在GitHub上可找到此代碼)
Github地址是:https://github.com/vihar/visualising-cnns/blob/master/01_MNIST-Image-Overview.ipynb (可以在jupyter notebook啟動jupyter)
現在,讓我們看看如何將單個圖像輸入神經網絡。
(在GitHub上可找到此代碼: https://github.com/vihar/visualising-cnns/blob/master/01_MNIST-Image-Overview.ipynb)
這就是將數字“ 3”分解為像素的方式。從一組手寫數字中,隨機選擇“ 3”,其中顯示像素值。在這里,ToTensor()歸一化實際像素值(0–255)并將其限制為0到1。為什么?因為,這使得以后的部分中的計算更加容易,無論是在解釋圖像還是找到圖像中存在的通用模式。
import cv2sobel = np.array([[ -1, -2, -1], [ 0, 0, 0], [ 1, 2, 1]])img = np.squeeze(images[7]) filtered_image = cv2.filter2D(img, -1, sobel)plt.imshow(filtered_image, cmap='gray') fig = plt.figure(figsize = (12,12)) ax = fig.add_subplot(111) ax.imshow(filtered_image, cmap='gray') width, height = filtered_image.shape thresh = filtered_image.max()/2.5 for x in range(width):for y in range(height):val = round(img[x][y],2) if filtered_image[x][y] !=0 else 0ax.annotate(str(val), xy=(y,x),color='white' if filtered_image[x][y]<thresh else 'black') filter4x4 = filter_vals = np.array([[-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1]]) img = np.squeeze(images[7]) filtered_image = cv2.filter2D(img, -1, filter4x4) plt.imshow(filtered_image, cmap='gray') fig = plt.figure(figsize = (12,12)) ax = fig.add_subplot(111) ax.imshow(filtered_image, cmap='gray') width, height = filtered_image.shape thresh = filtered_image.max()/2.5 for x in range(width):for y in range(height):val = round(img[x][y],2) if filtered_image[x][y] !=0 else 0ax.annotate(str(val), xy=(y,x),color='white' if filtered_image[x][y]<thresh else 'black')1.33.1.3.建立自己的濾波器
在卷積神經網絡中,圖像中的像素信息被過濾。為什么我們完全需要濾波器?就像孩子一樣,計算機需要經歷了解圖像的學習過程。值得慶幸的是,這不需要幾年的時間!計算機通過從頭開始學習,然后逐步進行到整體來完成此任務。因此,網絡必須首先知道圖像中的所有原始部分,例如邊緣,輪廓和其他低層特征。一旦檢測到這些,計算機便可以處理更復雜的功能。簡而言之,必須先提取低級功能,然后再提取中級功能,然后再提取高級功能。濾波器提供了一種提取信息的方法。
可以使用特定的濾波器提取低級特征,該濾波器也是類似于圖像的一組像素值。可以理解為連接CNN中各層的權重。將這些權重或濾波器與輸入相乘,得出中間圖像,中間圖像表示計算機對圖像的部分理解。然后,這些副產品再與更多的濾波器相乘以擴展視圖。該過程以及對功能的檢測一直持續到計算機了解其外觀為止。
您可以根據自己的需要使用很多濾波器。您可能需要模糊,銳化,加深,進行邊緣檢測等-都是濾波器。
讓我們看一些代碼片段,以了解濾波器的功能(以下代碼可以在github: https://github.com/vihar/visualising-cnns/blob/master/02_Writing%20Your%20Own%20Filter.ipynb)。
import matplotlib.pyplot as plt import matplotlib.image as mpimgimport cv2 import numpy as np%matplotlib inlineimage = mpimg.imread('dog.jpg')plt.imshow(image) gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)plt.imshow(gray, cmap='gray') custom_2x2 = np.array([[1,0],[1,0]])filtered_image = cv2.filter2D(gray, -1, custom_2x2)plt.imshow(filtered_image, cmap='gray') sobel_y = np.array([[ -1, -2, -1], [ 0, 0, 0], [ 1, 2, 1]])## TODO: Create and apply a Sobel x operator# Filter the image using filter2D, which has inputs: (grayscale image, bit-depth, kernel) filtered_image = cv2.filter2D(gray, -1, sobel_y)plt.imshow(filtered_image, cmap='gray')
這是應用濾波器后圖像的外觀。這種情況下,我們使用了Sobel濾波器。
1.33.2.完整的卷積神經網絡(CNNS)
我們已經知道濾波器是如何從圖像中提出特征了,但是為了完成整個卷積神經網絡我們需要理解用來設計CNN的各層。卷積神經網絡中的各層分別叫做:
?卷積層
?池化層
?全連接層
卷積神經網絡包含卷積層(Convolution)、非線性激活層(常用ReLU層)、池化層(pooling)、全連接層(Full-Connected)和Softmax層。卷積神經網絡的基本結構如下圖所示。
1.33.2.1.CNN各層的作用
卷積層—卷積層(CONV)使用過濾器執行卷積操作,同時掃描輸入圖像的尺寸。它的超參數包括濾波器尺寸,通常設置為2 * 2, 3 * 3, 4 * 4, 5 * 5(但并不僅僅限于這些尺寸),步長(S)。輸出結果(O)被稱為特征圖或激活圖,包含了輸入層和濾波器計算出的所有特征。下圖描述了應用卷積時產生的特殊圖:
卷積操作,左側圖像是6 * 6的大小,濾波器尺寸大小為3 * 3,步長為1,經過卷積操作之后,變成了4 * 4的大小。
池化層–池化層(POOL)用于特征的降采樣,通常在卷積層之后應用。常見的兩種池化操作為最大池化和平均池化,分別求取特征的最大值和平均值。下圖描述了池化的基本原理:
最大池化
平均池化
全連接層—全連接層(FC)作用于一個扁平的輸入,其中每個輸入都連接到所有的神經元。全連接層通常用于網絡的末端,將隱藏層連接到輸出層,這有助于優化類分數。
全連接層
1.33.2.2.在Pytorch可視化CNN
我們對CNN的函數有了更好的了解,現在讓我們使用Facebook的PyTorch框架來實現它。
步驟1:加載輸入圖像。我們將使用NumPy和OpenCV。(在GitHub上可找到代碼: https://github.com/vihar/visualising-cnns/blob/master/02_Writing%20Your%20Own%20Filter.ipynb)
import matplotlib.pyplot as plt import matplotlib.image as mpimgimport cv2 import numpy as np%matplotlib inline img_path = 'dog.jpg' bgr_img = cv2.imread(img_path) gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)# Normalise gray_img = gray_img.astype("float32")/255 plt.imshow(gray_img, cmap='gray') plt.show()步驟2:可視化濾波器,以更好地了解我們將使用的濾波器。(在GitHub上可找到代碼:https://github.com/vihar/visualising-cnns/blob/master/02_Writing%20Your%20Own%20Filter.ipynb)
import numpy as npfilter_vals = np.array([ [-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1] ]) print('Filter shape: ', filter_vals.shape)# define four filters filter_1 = filter_vals filter_2 = -filter_1 filter_3 = filter_1.T filter_4 = -filter_3 filters = np.array([filter_1, filter_2, filter_3, filter_4])# For an example, print out the values of filter 1 print('Filter 1: \n', filter_1)fig = plt.figure(figsize=(10, 5)) 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))width, height = filters[i].shapefor x in range(width):for y in range(height):ax.annotate(str(filters[i][x][y]), xy=(y,x),color='white' if filters[i][x][y]<0 else 'black')
步驟3:定義卷積神經網絡。該CNN具有卷積層和最大池化層,并且權重使用上述濾波器進行初始化:(GitHub上可找到代碼:https://github.com/vihar/visualising-cnns/blob/master/03_CNN%20Layers%20Visualisations%20.ipynb)
步驟4:可視化濾波器。快速瀏覽一下正在使用的濾波器。(在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))# plt.imshow(gray_img, cmap='gray')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) conv_x, activated_layer, pooled_layer = model.forward(gray_img_tensor)
濾波器:
**步驟5:**跨層濾波器輸出。在CONV和POOL層中輸出的圖像如下所示:
卷積層
池化層
總結
以上是生活随笔為你收集整理的卷积神经网络、比较MLPS和CNNS、滤波器、CNN各层的作用、在Pytorch可视化CNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广发信用卡分期利率
- 下一篇: 分红是怎么算的 不懂的一定要多看看