日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

卷积神经网络、比较MLPS和CNNS、滤波器、CNN各层的作用、在Pytorch可视化CNN

發布時間:2024/9/27 卷积神经网络 148 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卷积神经网络、比较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)

import torch import numpy as npfrom torchvision import datasets import torchvision.transforms as transformsnum_workers = 0 batch_size = 20transform = transforms.ToTensor()train_data = datasets.MNIST(root='data', train=True,download=True, transform=transform) test_data = datasets.MNIST(root='data', train=False,download=True, transform=transform)train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size,num_workers=num_workers) test_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, num_workers=num_workers)import matplotlib.pyplot as plt %matplotlib inlinedataiter = iter(train_loader) images, labels = dataiter.next() images = images.numpy()fig = plt.figure(figsize=(25, 4)) for image in np.arange(20):ax = fig.add_subplot(2, 20/2, image+1, xticks=[], yticks=[])ax.imshow(np.squeeze(images[image]), cmap='gray')ax.set_title(str(labels[image].item()))

現在,讓我們看看如何將單個圖像輸入神經網絡。
(在GitHub上可找到此代碼: https://github.com/vihar/visualising-cnns/blob/master/01_MNIST-Image-Overview.ipynb)

img = np.squeeze(images[7])fig = plt.figure(figsize = (12,12)) ax = fig.add_subplot(111) ax.imshow(img, cmap='gray') width, height = img.shape thresh = img.max()/2.5 for x in range(width):for y in range(height):val = round(img[x][y],2) if img[x][y] !=0 else 0ax.annotate(str(val), xy=(y,x),horizontalalignment='center',verticalalignment='center',color='white' if img[x][y]<thresh else 'black')

這就是將數字“ 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)

import torch import torch.nn as nn import torch.nn.functional as Fclass Net(nn.Module):def __init__(self, weight):super(Net, self).__init__()# initializes the weights of the convolutional layer to be the weights of the 4 defined filtersk_height, k_width = weight.shape[2:]# assumes there are 4 grayscale filtersself.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)self.conv.weight = torch.nn.Parameter(weight)# define a pooling layerself.pool = nn.MaxPool2d(2, 2)def forward(self, x):# calculates the output of a convolutional layer# pre- and post-activationconv_x = self.conv(x)activated_x = F.relu(conv_x)# applies pooling layerpooled_x = self.pool(activated_x)# returns all layersreturn conv_x, activated_x, pooled_x# instantiate the model and set the weights weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor) model = Net(weight)# print out the layer in the network print(model)

步驟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層中輸出的圖像如下所示:

viz_layer(activated_layer) viz_layer(pooled_layer)

卷積層

池化層

總結

以上是生活随笔為你收集整理的卷积神经网络、比较MLPS和CNNS、滤波器、CNN各层的作用、在Pytorch可视化CNN的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。