目錄
前言
一、卷積神經(jīng)網(wǎng)絡(luò)概述
二、卷積神經(jīng)網(wǎng)絡(luò)特點
卷積運算
單通道,二維卷積運算示例
單通道,二維,帶偏置的卷積示例
帶填充的單通道,二維卷積運算示例
Valid卷積
Same卷積
多通道卷積計算
1.局部感知域
2.參數(shù)共享
3.池化層
4.層次化提取
?三、卷積網(wǎng)絡(luò)組成結(jié)構(gòu)
前言
PyTorch可以說是三大主流框架中最適合初學(xué)者學(xué)習(xí)的了,相較于其他主流框架,PyTorch的簡單易用性使其成為初學(xué)者們的首選。這樣我想要強調(diào)的一點是,框架可以類比為編程語言,僅為我們實現(xiàn)項目效果的工具,也就是我們造車使用的輪子,我們重點需要的是理解如何使用Torch去實現(xiàn)功能而不要過度在意輪子是要怎么做出來的,那樣會牽扯我們太多學(xué)習(xí)時間。以后就出一系列專門細解深度學(xué)習(xí)框架的文章,但是那是較后期我們對深度學(xué)習(xí)的理論知識和實踐操作都比較熟悉才好開始學(xué)習(xí),現(xiàn)階段我們最需要的是學(xué)會如何使用這些工具。
深度學(xué)習(xí)的內(nèi)容不是那么好掌握的,包含大量的數(shù)學(xué)理論知識以及大量的計算公式原理需要推理。且如果不進行實際操作很難夠理解我們寫的代碼究極在神經(jīng)網(wǎng)絡(luò)計算框架中代表什么作用。不過我會盡可能將知識簡化,轉(zhuǎn)換為我們比較熟悉的內(nèi)容,我將盡力讓大家了解并熟悉神經(jīng)網(wǎng)絡(luò)框架,保證能夠理解通暢以及推演順利的條件之下,盡量不使用過多的數(shù)學(xué)公式和專業(yè)理論知識。以一篇文章快速了解并實現(xiàn)該算法,以效率最高的方式熟練這些知識。
博主專注數(shù)據(jù)建模四年,參與過大大小小數(shù)十來次數(shù)學(xué)建模,理解各類模型原理以及每種模型的建模流程和各類題目分析方法。此專欄的目的就是為了讓零基礎(chǔ)快速使用各類數(shù)學(xué)模型、機器學(xué)習(xí)和深度學(xué)習(xí)以及代碼,每一篇文章都包含實戰(zhàn)項目以及可運行代碼。博主緊跟各類數(shù)模比賽,每場數(shù)模競賽博主都會將最新的思路和代碼寫進此專欄以及詳細思路和完全代碼。希望有需求的小伙伴不要錯過筆者精心打造的專欄:
一文速學(xué)-數(shù)學(xué)建模常用模型https://blog.csdn.net/master_hunter/category_10967944.html
一、卷積神經(jīng)網(wǎng)絡(luò)概述
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡稱CNN)是一種特殊的人工神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),它在圖像識別、語音識別、自然語言處理等領(lǐng)域有著廣泛的應(yīng)用。CNN的特點在于其能夠自動提取輸入數(shù)據(jù)的特征,從而實現(xiàn)對輸入數(shù)據(jù)的高效分類和識別。根據(jù)專欄閱讀而到此部分的讀者對神經(jīng)網(wǎng)絡(luò)基礎(chǔ)都有很清晰的了解,普通的神經(jīng)網(wǎng)絡(luò)架構(gòu)的基本功能還是存在很多可以優(yōu)化的點。而卷積神經(jīng)網(wǎng)絡(luò)是一類包含卷積運算且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò),這里我們劃重點卷積運算和深度結(jié)果,前饋神經(jīng)網(wǎng)絡(luò)也就是具有前向傳播,沒有循環(huán)和記憶功能的單向網(wǎng)絡(luò)。那么只要認識到卷積運算和卷積神經(jīng)網(wǎng)絡(luò)的特殊性質(zhì)就可以很好的區(qū)分普通前饋神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)。
二、卷積神經(jīng)網(wǎng)絡(luò)特點
?卷積神經(jīng)網(wǎng)絡(luò)相對于普通神經(jīng)網(wǎng)絡(luò)在于以下四個特點:
- 局部感知域:CNN的神經(jīng)元只與輸入數(shù)據(jù)的一小部分區(qū)域相連接,這使得CNN對數(shù)據(jù)的局部結(jié)構(gòu)具有強大的敏感性,可以自動學(xué)習(xí)到圖像的特征。
- 參數(shù)共享:在CNN中,同一個卷積核(filter)在整個輸入圖像上滑動,共享權(quán)重和偏置。這減少了網(wǎng)絡(luò)的參數(shù)量,提高了模型的泛化能力。
- 池化層:通過池化層,CNN可以降低特征圖的分辨率,減少計算量,同時保留主要的特征信息,提高了網(wǎng)絡(luò)的抗噪能力和泛化能力。
- 層次化特征提取:通過堆疊多層卷積層和池化層,網(wǎng)絡(luò)可以逐級提取圖像的抽象特征,從低級特征如邊緣到高級特征如紋理、形狀等。
卷積運算
我們以多個實例來理解卷積運算:
單通道,二維卷積運算示例
紅色的方框圈中的數(shù)字和卷積核乘積再相加得到輸出數(shù)據(jù)。
單通道,二維,帶偏置的卷積示例
帶偏置的計算是在上述乘積運算之后加上偏置。
帶填充的單通道,二維卷積運算示例
對于以上實例填充邊緣為0的向量,是因為在標(biāo)準(zhǔn)的卷積過程中,存在兩個問題:
每次卷積運算后,圖像就會縮小,在經(jīng)歷多次運算后,圖像終會失去其形狀,變?yōu)??的 “柱狀”。
對于圖像邊緣的像素,其只被一個輸出所觸碰或者使用,但對于圖像中間的像素,則會有多個卷積核與之重疊。所以那些在角落或者邊緣區(qū)域的像素點在輸出中采用較少,意味著卷積過程丟掉了圖像邊緣位置的許多信息。
對于這個問題,可以采用額外的 “假”?像素(通常值為 0, 因此經(jīng)常使用的術(shù)語 ”零填充“ )填充邊緣。這樣,在滑動時的卷積核可以允許原始邊緣像素位于其中心,同時延伸到邊緣之外的假像素。假設(shè)填充的像素大小為??,則??就變成了??,故其輸出圖像的尺寸為?
。至于選擇填充多少像素,通常有兩個選擇,分別叫做 Valid 卷積和 Same 卷積。
Valid卷積
Valid 卷積意味著不填充,如之前所述,圖像會經(jīng)歷卷積運算后逐漸縮小,輸出的圖像尺寸即為上述公式:。
Same卷積
Same卷積意味填充后,輸出圖像的尺寸與輸入圖像的尺寸相同,根據(jù)上述公式,令?,可得到
。當(dāng)??時,。一般卷積核??的大小會選擇一個奇數(shù),如 3 \ 5 \ 7 等。主要因為:
- 如果? 是一個偶數(shù),那么只能使用一些不對稱填充。只有當(dāng)? 是奇數(shù)時,Same 卷積才會有自然的填充,即可以選擇同樣的數(shù)量填充四周。
- 當(dāng)卷積核??是奇數(shù)時,其只有一個中心點,在具體的程序?qū)崿F(xiàn)過程中會便于指出卷積核的位置。
多通道卷積計算
多通道卷積會按通道進行輸入數(shù)據(jù)和濾波器的卷積運算,并將結(jié)果相加, 從而得到輸出
以上篇文章卷積神經(jīng)網(wǎng)絡(luò)對Cifar10圖像的分類卷積運算的過程,整體網(wǎng)絡(luò)計算架構(gòu)為:
原圖像(尺寸為)分別和個的卷積核(又名濾波器,filiter)進行卷積運算,得到個的特征圖(feature map),每個特征圖分別添加不同的偏置(bias),具體為特征圖中的每個元素?,對每個特征圖添加激活函數(shù)?,進行非線性運算,將這??個特征圖依次疊加,得到最終的特征圖(尺寸為?)。
1.局部感知域
局部感知域指的是網(wǎng)絡(luò)中的每一個神經(jīng)元只對輸入數(shù)據(jù)的一個局部區(qū)域進行感知,而不是整個輸入數(shù)據(jù)。
?在卷積神經(jīng)網(wǎng)絡(luò)中,每個神經(jīng)元的權(quán)重是共享的。這意味著在處理不同的輸入位置時,使用的權(quán)重是相同的。這種權(quán)重共享使得網(wǎng)絡(luò)對于平移不變性具有很強的適應(yīng)能力。卷積操作只關(guān)注輸入數(shù)據(jù)的局部區(qū)域,而非整個輸入數(shù)據(jù)。這樣可以減少網(wǎng)絡(luò)的參數(shù)數(shù)量,降低計算復(fù)雜度。由于權(quán)重共享和稀疏連接的特性,卷積神經(jīng)網(wǎng)絡(luò)能夠高效地處理大規(guī)模的輸入數(shù)據(jù),如高分辨率圖像。通過卷積操作,網(wǎng)絡(luò)可以逐步提取輸入數(shù)據(jù)的局部特征,從低層到高層,逐步抽象和組合特征,形成對于整體特征的理解。
2.參數(shù)共享
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)的參數(shù)共享是指在網(wǎng)絡(luò)的不同位置使用相同的參數(shù)(權(quán)重和偏置)來處理輸入數(shù)據(jù)的不同區(qū)域,這是卷積層的一個重要特點。
具體來說,卷積操作在處理輸入數(shù)據(jù)時,會使用一個稱為卷積核(filter)的小窗口,通過與輸入數(shù)據(jù)的局部區(qū)域進行卷積運算來提取特征。而在整個輸入數(shù)據(jù)上,使用的卷積核是相同的。這意味著網(wǎng)絡(luò)的不同位置使用的權(quán)重是共享的。
這種參數(shù)共享有以下幾個重要特點:
減少參數(shù)數(shù)量:由于同一個卷積核在不同位置共享,網(wǎng)絡(luò)的參數(shù)數(shù)量大大減少。這降低了模型的復(fù)雜度,減少了過擬合的可能性。
增強模型的平移不變性:由于同一特征的卷積核在不同位置使用相同的權(quán)重,使得模型對輸入數(shù)據(jù)的平移具有不變性,從而能夠更好地處理平移變換后的數(shù)據(jù)。
提高計算效率:參數(shù)共享減少了計算量,因為不同位置使用相同的權(quán)重進行計算,避免了重復(fù)計算。
# 定義一個簡單的卷積神經(jīng)網(wǎng)絡(luò)
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# 定義一個卷積層,使用3個3x3的卷積核
self.conv = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3)
def forward(self, x):
# 使用卷積操作處理輸入數(shù)據(jù)
x = self.conv(x)
return x
?self.conv
是一個卷積層,它使用了3個3x3的卷積核進行卷積操作。無論輸入數(shù)據(jù)的哪一個位置,這3個卷積核的參數(shù)都是相同的。
3.池化層
對于??的特征圖,其池化過程僅需通過池化核對該特征圖進行池化運算即可得到輸出。
? 在通過卷積獲得了特征 (features) 之后,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓(xùn)練分類器,但這樣做會面臨巨大計算量的挑戰(zhàn)。并且容易出現(xiàn)過擬合 (over-fitting)。
池化層通過對特征圖進行降維,減少了后續(xù)層的計算量,同時保留了重要的特征。卷積后的特征具有一種“靜態(tài)性”的屬性,意味著在一個圖像區(qū)域有用的特征極有可能在另一個區(qū)域同樣適用。也就是說一張圖片有多只鳥,在一個區(qū)域提取的鳥圖像的特征在該圖像的另一端鳥圖像的特征也同樣適用。與卷積層類似,池化操作也使用一個移動的窗口,但它的操作是簡單的統(tǒng)計匯總(如最大值或平均值)。這些統(tǒng)計到的特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結(jié)果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling)。
import torch
import torch.nn as nn
# 定義一個示例的特征圖(假設(shè)通道數(shù)為3,高度為4,寬度為4)
feature_map = torch.randn(1, 3, 4, 4) # 1表示batch size
# 定義一個最大池化層,窗口大小為2x2,步幅為2
max_pooling_layer = nn.MaxPool2d(kernel_size=2, stride=2)
# 應(yīng)用最大池化層
output = max_pooling_layer(feature_map)
# 輸出的尺寸會縮小一半(因為窗口大小為2x2,步幅為2)
print(output.shape)
這樣需要注意的是,池化操作是對每個通道分別進行的,不會改變通道的數(shù)量。池化層對于一定程度的平移、旋轉(zhuǎn)、縮放等變化保持不變性,即使特征稍微移動也能被正確檢測到,減少了特征圖的維度,也減少了模型的參數(shù)數(shù)量,有助于減輕過擬合的問題。
4.層次化提取
根據(jù)以上的圖例很容易明白CNN的的計算層次化,CNN 由多個卷積層和池化層組成,每一層都可以提取出不同層次的特征。前層主要提取低級特征(如邊緣、紋理等),后層逐漸提取高級抽象的特征(如形狀、對象等)。每一層的特征都是基于前一層的特征提取的,這樣多層的疊加使得網(wǎng)絡(luò)能夠提取出更加復(fù)雜的特征。隨著層次的增加,特征圖的尺寸逐漸縮小,這減少了后續(xù)層的計算量。
?三、卷積網(wǎng)絡(luò)組成結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)的基本架構(gòu)通常包括以下幾種層:
輸入層(Input Layer):接受原始數(shù)據(jù)輸入,例如圖像,其尺寸與輸入圖像的尺寸相匹配。
卷積層(Convolutional Layer):負責(zé)特征提取。卷積核在輸入數(shù)據(jù)上滑動,計算每個位置的卷積,從而得到特征圖。多個卷積核可以提取多種特征。通常會使用ReLU等激活函數(shù)來引入非線性。
池化層(Pooling Layer):減小特征圖的尺寸,同時保留最重要的信息。常用的池化操作是最大池化和平均池化。
全連接層(Fully Connected Layer):將之前層次提取的特征進行扁平化,并通過全連接操作將其與輸出層相連接。
輸出層(Output Layer):根據(jù)任務(wù)的不同,可以是一個全連接層,也可以是一個Softmax層,用于分類問題。
批歸一化層(Batch Normalization Layer):用于加速訓(xùn)練過程,提升模型的泛化性能。
Dropout層:在訓(xùn)練過程中隨機斷開一部分神經(jīng)元,防止過擬合。
殘差連接(Residual Connection):引入跳躍連接,可以在深層網(wǎng)絡(luò)中減輕梯度消失問題。
卷積核(Kernel):卷積操作的核心部分,可以將其視為特征檢測器。
?一個簡單的卷積神經(jīng)網(wǎng)絡(luò)示例:
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(32 * 16 * 16, 512)
self.fc2 = nn.Linear(512, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 32 * 16 * 16)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
# 創(chuàng)建網(wǎng)絡(luò)實例
net = SimpleCNN()
# 打印網(wǎng)絡(luò)結(jié)構(gòu)
print(net)
?其中包含兩個卷積層、兩個池化層和兩個全連接層。文章來源:http://www.zghlxwxcb.cn/news/detail-731298.html
具體案例參考PyTorch實戰(zhàn):實現(xiàn)Cifar10彩色圖片分類文章來源地址http://www.zghlxwxcb.cn/news/detail-731298.html
到了這里,關(guān)于PyTorch實戰(zhàn):卷積神經(jīng)網(wǎng)絡(luò)詳解+Python實現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)Cifar10彩色圖片分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!