卷積神經網絡無法繞開的大神——LeNet
- 1. 基本架構
- 2. LeNet 5
- 3. LeNet 5 代碼
1. 基本架構

2. LeNet 5

- LeNet 5: 5 表示的是5個核心層,2個卷積層,3個全連接層.
- 核心權重層:卷積層、全連接層、循環(huán)層,Batchnorm / Dropout 這些都屬于附屬層。
- Convolutions, 32×32 → 28×28:卷積過后,圖像像素損失了4個,是因為 kernal_size是5×5. 那個年代是不補零的。
- Subsampling: 亞采樣,也叫池化層,池化一次,圖像大小縮小一般,層數不變。
- 卷積負責把圖像層數變得越來越多,池化負責把圖像變得越來越小。最后使用全連接,輸出類別。
3. LeNet 5 代碼
import torch
from torch import nnclass ConvBlock(nn.Module):"""一層卷積:- 卷積層- 批規(guī)范化層- 激活層"""def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):super().__init__()self.conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels,kernel_size=kernel_size, stride=stride,padding=padding)self.bn = nn.BatchNorm2d(num_features=out_channels)self.relu = nn.ReLU()def forward(self, x):x = self.conv(x)x = self.bn(x)x = self.relu(x)return xclass LeNet(nn.Module):def __init__(self):super().__init__()self.feature_extractor = nn.Sequential(ConvBlock(in_channels=1, out_channels=6, kernel_size=5,stride=1,padding=0),nn.MaxPool2d(kernel_size=2, stride=2, padding=0),ConvBlock(in_channels=6, out_channels=16, kernel_size=5,stride=1,padding=0),nn.MaxPool2d(kernel_size=2, stride=2, padding=0),)self.classifier = nn.Sequential(nn.Flatten(),nn.Linear(in_features=400, out_features=120),nn.ReLU(),nn.Linear(in_features=120, out_features=84),nn.ReLU(),nn.Linear(in_features=84, out_features=10))def forward(self, x):x = self.feature_extractor(x)x = self.classifier(x)return xif __name__ == "__main__":model = LeNet()print(model)x = torch.randn(1, 1, 32, 32)y = model(x)print(y.shape)