當(dāng)前位置:首頁 > 學(xué)習(xí)資源 > 講師博文 > 卷積神經(jīng)網(wǎng)絡(luò)(CNN)必備基礎(chǔ)知識(shí)
在計(jì)算機(jī)視覺和深度學(xué)習(xí)領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN) 是一類深度學(xué)習(xí)算法,廣泛應(yīng)用于計(jì)算機(jī)視覺、自然語言處理、語音識(shí)別等領(lǐng)域。作為深度學(xué)習(xí)的重要組成部分,CNN的核心思想是通過模仿生物視覺皮層的工作原理,有效地提取和學(xué)習(xí)圖像或其他數(shù)據(jù)中的特征。
本文將帶你快速掌握 CNN 的核心概念,并通過 PyTorch 實(shí)現(xiàn)一個(gè)經(jīng)典的手寫數(shù)字分類模型(MNIST),助你快速入門!
一、 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
首先需要了解神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)知識(shí)。神經(jīng)網(wǎng)絡(luò)由多個(gè)神經(jīng)元(或節(jié)點(diǎn))組成,每個(gè)神經(jīng)元通過連接傳遞信息,類似于生物神經(jīng)系統(tǒng)的運(yùn)作方式。最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)包括輸入層、隱藏層和輸出層。
· 輸入層:接受外部數(shù)據(jù)輸入。
· 隱藏層:通過加權(quán)計(jì)算輸入信號(hào)并進(jìn)行非線性變換。
· 輸出層:根據(jù)隱藏層的計(jì)算結(jié)果產(chǎn)生輸出。
CNN 是一種特殊的神經(jīng)網(wǎng)絡(luò),它在傳統(tǒng)的全連接層基礎(chǔ)上引入了卷積層、池化層等層次結(jié)構(gòu),專門設(shè)計(jì)用于處理具有格狀結(jié)構(gòu)的數(shù)據(jù)(如圖像)。
二、CNN 的核心組成結(jié)構(gòu)
1. 卷積層(Convolutional Layer)
· 使用可學(xué)習(xí)的卷積核(Filter)對(duì)輸入進(jìn)行滑動(dòng)卷積操作,提取局部特征。
· 卷積操作的基本過程如下:
o 使用卷積核在輸入數(shù)據(jù)上滑動(dòng),通過點(diǎn)乘計(jì)算卷積結(jié)果。
o 通過滑動(dòng)窗口將卷積核應(yīng)用于圖像的不同區(qū)域,從而提取局部特征(如邊緣、紋理等)。
o 結(jié)果稱為特征圖(Feature Map),是對(duì)輸入數(shù)據(jù)局部區(qū)域的提取。
· 卷積的主要作用是提取邊緣、紋理、形狀等局部結(jié)構(gòu)。
2. 池化層(Pooling Layer)
· 池化層用于減少數(shù)據(jù)的維度,從而降低計(jì)算復(fù)雜度并避免過擬合。最常用的池化方式有最大池化和平均池化。
o 最大池化:從池化窗口中選取最大的值作為輸出。
o 平均池化:從池化窗口中選取平均值作為輸出。
· 池化操作通過減少空間維度,使得CNN更具魯棒性,能夠識(shí)別圖像中的重要特征,而不受小的平移和變形影響。
3. 激活函數(shù)
激活函數(shù)的作用是引入非線性特征,使得網(wǎng)絡(luò)能夠逼近復(fù)雜的函數(shù)。CNN中常用的激活函數(shù)包括ReLU(Rectified Linear Unit)、Sigmoid和Tanh等。
· ReLU:最常用的激活函數(shù),定義為:ReLU(x)=max(0,x)
ReLU 函數(shù)具有較好的非線性特性,且能夠避免梯度消失問題,因此廣泛應(yīng)用于現(xiàn)代深度神經(jīng)網(wǎng)絡(luò)中。
· 激活函數(shù)通過在卷積層和全連接層后進(jìn)行非線性變換,增加了網(wǎng)絡(luò)的表達(dá)能力。
4. 全連接層(Fully Connected Layer)
· 全連接層(Fully Connected Layer,簡(jiǎn)稱FC)在CNN中通常位于網(wǎng)絡(luò)的最后部分,用于將卷積和池化操作提取到的特征映射到最終的類別標(biāo)簽。全連接層的每個(gè)神經(jīng)元都與上一層的所有神經(jīng)元相連,因此參數(shù)較多,計(jì)算量較大。
三、卷積神經(jīng)網(wǎng)絡(luò)的工作流程
CNN的工作流程可以簡(jiǎn)要總結(jié)為以下幾個(gè)步驟:
1. 輸入圖像:圖像被輸入到CNN的輸入層。
2. 卷積層:卷積層使用卷積核對(duì)圖像進(jìn)行卷積操作,提取局部特征。
3. 池化層:池化層對(duì)卷積后的特征圖進(jìn)行下采樣,減少數(shù)據(jù)維度。
4. 激活函數(shù):激活函數(shù)對(duì)每一層的輸出進(jìn)行非線性變換。
5. 全連接層:將提取到的特征映射到最終的類別標(biāo)簽。
6. 輸出層:網(wǎng)絡(luò)輸出分類結(jié)果或回歸預(yù)測(cè)。
四、卷積神經(jīng)網(wǎng)絡(luò)的工作流程
卷積輸出尺寸計(jì)算公式:
五、PyTorch 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 CNN 分類模型
我們將使用 MNIST 數(shù)據(jù)集(10類手寫數(shù)字,圖像大小為 28×28)來訓(xùn)練和測(cè)試一個(gè)基本的卷積神經(jīng)網(wǎng)絡(luò)。
安裝依賴
pip install torch torchvision matplotlib
代碼示例
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 設(shè)置運(yùn)行設(shè)備
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 數(shù)據(jù)預(yù)處理:轉(zhuǎn)為Tensor,并進(jìn)行歸一化
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
# 加載 MNIST 數(shù)據(jù)集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)
# 定義 CNN 模型
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.pool = nn.MaxPool2d(2)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x))) # 輸出大小:(10, 12, 12)
x = self.pool(torch.relu(self.conv2(x))) # 輸出大小:(20, 4, 4)
x = x.view(-1, 320) # 展平
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 模型訓(xùn)練配置
model = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 訓(xùn)練模型
for epoch in range(1, 6):
model.train()
for data, target in train_loader:
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
print(f'Epoch {epoch}, Loss: {loss.item():.4f}')
# 模型測(cè)試
model.eval()
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
pred = output.argmax(dim=1)
correct += pred.eq(target).sum().item()
accuracy = 100. * correct / len(test_loader.dataset)
print(f'\nTest Accuracy: {accuracy:.2f}%')
總結(jié)
卷積神經(jīng)網(wǎng)絡(luò)(CNN)通過模擬生物視覺系統(tǒng)的工作方式,有效地提取圖像等數(shù)據(jù)中的特征,廣泛應(yīng)用于計(jì)算機(jī)視覺和其他深度學(xué)習(xí)任務(wù)。理解CNN的基本構(gòu)成,包括卷積操作、池化操作、激活函數(shù)和全連接層,是掌握這一技術(shù)的基礎(chǔ)。
隨著深度學(xué)習(xí)研究的不斷深入,CNN在多個(gè)領(lǐng)域的應(yīng)用也不斷擴(kuò)大,不僅限于圖像處理,也已延伸到語音識(shí)別、自然語言處理等多種領(lǐng)域。掌握CNN的基礎(chǔ)知識(shí),能為進(jìn)一步深入學(xué)習(xí)和研究深度學(xué)習(xí)奠定良好的基礎(chǔ)。