CNN卷積神經網絡之LeNet和AlexNet經典網絡模型(三)
文章目錄
- CNN卷積神經網絡之LeNet和AlexNet經典網絡模型(三)
- 深度學習兩大經典 CNN 模型速覽
- 1. LeNet-5:CNN 的開山之作(1998)
- 2. AlexNet:深度學習里程碑(2012)
- 3. 核心差異對比
- 4. 可一鍵運行的 PyTorch 實現
- 4.1 LeNet-5(MNIST)
- 4.2 AlexNet(ImageNet 簡化版,可在 CIFAR-10 上跑通)
- 5. 小結 & 面試高頻問答
深度學習兩大經典 CNN 模型速覽
LeNet-5(1998)與 AlexNet(2012)——從 32×32 灰度手寫數字到 224×224 彩色 ImageNet 的跨越
1. LeNet-5:CNN 的開山之作(1998)
1998年Yann LeCun等提出LeNets5 ,是第一個成功應用于手寫數字識別問題并產生實際商業(郵政行業)價值的卷積神經網絡
關鍵詞 | 要點 |
---|---|
任務 | MNIST 手寫數字識別 |
輸入 | 1×32×32 灰度圖 |
結構 | 7 層:C1(6@28×28) → S2 → C3(16@10×10) → S4 → C5(120@1×1) → F6(84) → Output(10) |
卷積核 | 5×5 |
池化 | 2×2 平均池化 |
激活 | Sigmoid(歷史版本) |
參數量 | ≈ 60 k |
創新 | 首次將 BP-CNN 成功用于商業(USPS 郵編) |
整體網絡解讀:
2. AlexNet:深度學習里程碑(2012)
關鍵詞 | 要點 |
---|---|
任務 | ImageNet 1000 類分類 |
輸入 | 3×224×224 |
結構 | 8 層:5 卷積 + 3 全連接 |
卷積核 | 11×11, 5×5, 3×3 |
池化 | 3×3 重疊最大池化 |
激活 | ReLU(首次大規模使用) |
正則 | Dropout 0.5、數據增強 |
歸一化 | LRN(后被 BatchNorm 取代) |
訓練 | 2×GTX 580 GPU(3 GB 顯存) |
成績 | Top-5 16.4 % → 15.3 %(7 模型融合) |
模型結構:
3. 核心差異對比
維度 | LeNet-5 | AlexNet |
---|---|---|
輸入尺寸 | 32×32 | 224×224 |
網絡深度 | 7 層 | 8 層 |
激活函數 | Sigmoid | ReLU |
GPU 訓練 | 無 | 有(2 GPU 并行) |
數據集 | MNIST(60 k) | ImageNet(1.2 M) |
參數量 | 60 k | 60 M |
4. 可一鍵運行的 PyTorch 實現
環境:Python≥3.8,PyTorch≥1.12,torchvision
4.1 LeNet-5(MNIST)
# lenet5.py
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as Tclass LeNet5(nn.Module):def __init__(self, num_classes=10):super().__init__()self.features = nn.Sequential(nn.Conv2d(1, 6, 5), nn.Tanh(), # C1nn.AvgPool2d(2), # S2nn.Conv2d(6, 16, 5), nn.Tanh(), # C3nn.AvgPool2d(2), # S4nn.Conv2d(16, 120, 5), nn.Tanh() # C5)self.classifier = nn.Sequential(nn.Linear(120, 84), nn.Tanh(), # F6nn.Linear(84, num_classes) # Output)def forward(self, x):x = self.features(x)x = x.flatten(1)return self.classifier(x)def train_lenet():transform = T.Compose([T.Resize(32), T.ToTensor()])train_ds = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)train_dl = torch.utils.data.DataLoader(train_ds, batch_size=64, shuffle=True)net = LeNet5()opt = optim.Adam(net.parameters(), lr=1e-3)loss_fn = nn.CrossEntropyLoss()for epoch in range(3):for x, y in train_dl:opt.zero_grad()out = net(x)loss = loss_fn(out, y)loss.backward()opt.step()print(f"Epoch {epoch+1} loss={loss.item():.4f}")torch.save(net.state_dict(), 'lenet5.pth')if __name__ == "__main__":train_lenet()
4.2 AlexNet(ImageNet 簡化版,可在 CIFAR-10 上跑通)
# alexnet_cifar.py
import torch, torchvision, torch.nn as nn, torch.optim as optim
from torchvision import transforms as Tclass AlexNet(nn.Module):def __init__(self, num_classes=10):super().__init__()self.features = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2),nn.Conv2d(64, 192, kernel_size=3, padding=1), nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2),nn.Conv2d(192, 384, kernel_size=3, padding=1), nn.ReLU(inplace=True),nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2),)self.classifier = nn.Sequential(nn.Dropout(0.5),nn.Linear(256*4*4, 4096), nn.ReLU(inplace=True),nn.Dropout(0.5),nn.Linear(4096, 4096), nn.ReLU(inplace=True),nn.Linear(4096, num_classes))def forward(self, x):x = self.features(x)x = torch.flatten(x, 1)return self.classifier(x)def train_alexnet():transform = T.Compose([T.Resize(64), T.ToTensor()])train_ds = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)train_dl = torch.utils.data.DataLoader(train_ds, batch_size=128, shuffle=True)net = AlexNet()opt = optim.SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)loss_fn = nn.CrossEntropyLoss()for epoch in range(10):for x, y in train_dl:opt.zero_grad()out = net(x)loss = loss_fn(out, y)loss.backward()opt.step()print(f"Epoch {epoch+1} loss={loss.item():.4f}")torch.save(net.state_dict(), 'alexnet_cifar.pth')if __name__ == "__main__":train_alexnet()
5. 小結 & 面試高頻問答
問題 | 一句話答案 |
---|---|
LeNet-5 為何用 5×5? | 當時算力與感受野權衡下的最優。 |
AlexNet 為何用 ReLU? | 解決 Sigmoid 梯度消失,加速 6× 訓練時間。 |
Dropout 的本質? | 訓練時隨機“掐掉”神經元,等價于多模型投票,減少過擬合。 |
LRN 現在還用嗎? | 基本不用,BatchNorm 更穩定。 |
兩個網絡最大啟示? | 更深、更大、更多數據 + GPU并行 是提升性能的核心路線。 |
1、Dropout:正則化方法,提高模型泛化能力。
2、LRN:對于每個神經元,LRN會將其輸出按照局部范圍進行加權平均,然后將加權平均值除以一個尺度因子(通常為2),最后將結果取平方根并減去均值,得到歸一化后的輸出。