一、LeNet-5概述
LeNet-5是由Yann LeCun等人於1998年提出的卷積神經網路模型,是一種經典的網路結構。它主要應用於手寫數字識別,但是還可以用於其他分類任務。LeNet-5是第一個成功應用於實際任務的卷積神經網路,開創了卷積神經網路的先河。LeNet-5採用卷積層、池化層和全連接層組成。
二、LeNet-5網路結構
LeNet-5總共有7層,包括3個卷積層,2個池化層和2個全連接層。其中第一個卷積層和第二個卷積層後面跟著一個池化層,第三個卷積層後面沒有池化層。最後兩個全連接層分別作為輸出層的前一層和輸出層。
代碼示例:
import torch.nn as nn import torch.nn.functional as F class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1) self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv3 = nn.Conv2d(16, 120, kernel_size=5, stride=1) self.fc1 = nn.Linear(120, 84) self.fc2 = nn.Linear(84, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool1(x) x = F.relu(self.conv2(x)) x = self.pool2(x) x = F.relu(self.conv3(x)) x = x.view(x.size(0), -1) x = F.relu(self.fc1(x)) x = self.fc2(x) return x
三、卷積層和池化層
卷積層:卷積層是LeNet-5的核心組成部分之一。卷積層採用濾波器對輸入的圖像進行卷積操作。濾波器通過對圖像進行卷積操作,提取圖像的特徵,例如邊緣、線條和顏色等。每個卷積層由多個濾波器組成,每個濾波器都有自己的權重和偏置。卷積層的輸出通常通過非線性函數,如ReLU函數進行激活。從第一個卷積層到第三個卷積層,卷積核的數量逐漸增加,第一個卷積層有6個卷積核,第二個卷積層有16個卷積核,第三個卷積層有120個卷積核。
池化層:池化層是卷積神經網路中的另一個重要組成部分。最常見的池化方法是最大池化。最大池化使用一個矩形窗口從輸入特徵映射中提取最大值,然後將窗口向右或向下移動一個固定的步長,這樣就可以在空間上下採樣特徵映射。池化層可以減少特徵映射的大小,從而減輕計算負擔,並且可以防止過擬合。
代碼示例:
self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1) self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv3 = nn.Conv2d(16, 120, kernel_size=5, stride=1)
四、全連接層
全連接層是在卷積和池化層之後,將所有的神經元都連接起來進行分類。在LeNet-5中,有兩個全連接層,分別是一個隱藏層和一個輸出層。隱藏層有84個神經元,輸出層有10個神經元,對應手寫數字的10個類別。
代碼示例:
self.fc1 = nn.Linear(120, 84) self.fc2 = nn.Linear(84, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool1(x) x = F.relu(self.conv2(x)) x = self.pool2(x) x = F.relu(self.conv3(x)) x = x.view(x.size(0), -1) x = F.relu(self.fc1(x)) x = self.fc2(x) return x
五、損失函數和優化器
損失函數:在神經網路中,損失函數是評估模型預測與真實標籤之間誤差的函數。在LeNet-5中,我們使用交叉熵作為損失函數。交叉熵可以在分類問題中幫助加速模型的訓練。
優化器:在訓練的過程中,我們需要尋找最優的權重和偏置。我們採用隨機梯度下降(SGD)作為優化器,它是最常用的優化方法之一。SGD沿著梯度的反方向更新權重和偏置,以最小化損失函數的值。
代碼示例:
criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
六、模型訓練和測試
在LeNet-5的訓練過程中,我們需要將模型輸入的數據轉為張量的形式,並將其輸入到LeNet-5模型中進行訓練,計算損失和更新權重,最後得到訓練好的模型。在測試階段,我們需要輸入測試數據,然後計算模型的輸出並對其進行預測。
for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): images = images.to(device) labels = labels.to(device) outputs = net(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() total = 0 correct = 0 with torch.no_grad(): for images, labels in test_loader: images = images.to(device) labels = labels.to(device) outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = 100 * correct / total print("Epoch [{}/{}], Accuracy: {:.2f}%".format(epoch+1, num_epochs, accuracy))
七、結論
LeNet-5是一種經典的卷積神經網路模型,採用了卷積層、池化層和全連接層進行手寫數字識別。LeNet-5的成功應用證明了卷積神經網路在計算機視覺領域中的重要性,並成為後續卷積神經網路設計的重要參考。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/189891.html