一、卷積知識擴展
1. 二維卷積
單通道版本
對于單通道輸入圖像 III (尺寸 H×WH \times WH×W) 和卷積核 KKK (尺寸 F×FF \times FF×F),輸出特征圖 OOO 的計算公式為:
O(i,j)=∑m=0F?1∑n=0F?1I(i+m,j+n)?K(m,n)O(i,j) = \sum_{m=0}^{F-1} \sum_{n=0}^{F-1} I(i+m, j+n) \cdot K(m, n)O(i,j)=m=0∑F?1?n=0∑F?1?I(i+m,j+n)?K(m,n)
計算過程示例:
多通道版本
對于多通道輸入 III (尺寸 H×W×CinH \times W \times C_{in}H×W×Cin?) 和卷積核 KKK (尺寸 F×F×CinF \times F \times C_{in}F×F×Cin?),輸出特征圖的計算公式為:
O(i,j)=∑c=0Cin?1∑m=0F?1∑n=0F?1Ic(i+m,j+n)?Kc(m,n)+bO(i,j) = \sum_{c=0}^{C_{in}-1} \sum_{m=0}^{F-1} \sum_{n=0}^{F-1} I_c(i+m, j+n) \cdot K_c(m, n) + bO(i,j)=c=0∑Cin??1?m=0∑F?1?n=0∑F?1?Ic?(i+m,j+n)?Kc?(m,n)+b
其中 bbb 是偏置項,每個輸出通道有獨立的偏置。
2. 三維卷積
三維卷積用于處理時空數據(如視頻、3D醫學影像):
- 輸入維度:深度 × 高度 × 寬度 × 通道 (D×H×W×C)
- 卷積核維度:時間/深度 × 高度 × 寬度 × 輸入通道 × 輸出通道 (T×F×F×C_in×C_out)
- 輸出計算:
O(d,i,j)=∑t=0T?1∑c=0Cin?1∑m=0F?1∑n=0F?1Ic(d+t,i+m,j+n)?Kc,t(m,n)O(d,i,j) = \sum_{t=0}^{T-1} \sum_{c=0}^{C_{in}-1} \sum_{m=0}^{F-1} \sum_{n=0}^{F-1} I_c(d+t, i+m, j+n) \cdot K_{c,t}(m, n)O(d,i,j)=t=0∑T?1?c=0∑Cin??1?m=0∑F?1?n=0∑F?1?Ic?(d+t,i+m,j+n)?Kc,t?(m,n)
應用場景:
- 視頻動作識別
- 3D醫學圖像分割
- 氣象數據分析
3. 反卷積(轉置卷積)
反卷積用于上采樣操作,常見于圖像分割和生成模型:
計算過程
- 在輸入特征圖元素間插入零填充
- 應用標準卷積操作
數學表示:
輸入 XXX (尺寸 Hin×WinH_{in} \times W_{in}Hin?×Win?),輸出 YYY (尺寸 Hout×WoutH_{out} \times W_{out}Hout?×Wout?):
KaTeX parse error: Expected 'EOF', got '_' at position 57: … + \text{kernel_?size} - 2 \time…
底層計算:
通過矩陣轉置實現:
- 標準卷積:Y=WXY = WXY=WX
- 反卷積:X=WTYX = W^TYX=WTY
4. 膨脹卷積(空洞卷積)
膨脹卷積通過間隔采樣擴大感受野:
- 膨脹率 rrr:采樣間隔
- 實際感受野:F′=F+(F?1)(r?1)F' = F + (F-1)(r-1)F′=F+(F?1)(r?1)
計算公式:
O(i,j)=∑m=0F?1∑n=0F?1I(i+r?m,j+r?n)?K(m,n)O(i,j) = \sum_{m=0}^{F-1} \sum_{n=0}^{F-1} I(i + r \cdot m, j + r \cdot n) \cdot K(m, n)O(i,j)=m=0∑F?1?n=0∑F?1?I(i+r?m,j+r?n)?K(m,n)
優勢:
- 不增加參數量的情況下擴大感受野
- 保持特征圖分辨率
- 適用于語義分割(如DeepLab)
5. 可分離卷積
空間可分離卷積
將大卷積核分解為小核乘積:
K3x3=K3x1×K1x3K_{3x3} = K_{3x1} \times K_{1x3}K3x3?=K3x1?×K1x3?
原始3x3核: 分解后:
[a,b,c] [a] [x,y,z]
[d,e,f] => [d] × [x,y,z]
[g,h,i] [g]
優勢:參數量從9減少到6(3+3)
圖示:
深度可分離卷積
分為兩步:
- 深度卷積:單通道卷積
- 輸入:H×W×CinH \times W \times C_{in}H×W×Cin?
- 輸出:H×W×CinH \times W \times C_{in}H×W×Cin?
- 逐點卷積:1×1卷積
- 輸入:H×W×CinH \times W \times C_{in}H×W×Cin?
- 輸出:H×W×CoutH \times W \times C_{out}H×W×Cout?
參數量對比:
- 標準卷積:F×F×Cin×CoutF \times F \times C_{in} \times C_{out}F×F×Cin?×Cout?
- 深度可分離:(F×F×Cin)+(1×1×Cin×Cout)(F \times F \times C_{in}) + (1 \times 1 \times C_{in} \times C_{out})(F×F×Cin?)+(1×1×Cin?×Cout?)
效率提升:MobileNet中可減少8-9倍計算量
圖1:輸入圖的每一個通道,我們都使用了對應的卷積核進行卷積。 通道數量 = 卷積核個數,每個卷積核只有一個通道
圖2:完成卷積后,對輸出內容進行1x1
的卷積
6. 分組卷積
將輸入通道分為 GGG 組,每組獨立卷積:
- 標準卷積:所有輸入通道→所有輸出通道
- 分組卷積:組內輸入通道→組內輸出通道
數學表達:
Og(i,j)=∑c∈groupg∑m∑nIc(i+m,j+n)?Kg,c(m,n)O_g(i,j) = \sum_{c \in \text{group}_g} \sum_{m} \sum_{n} I_c(i+m,j+n) \cdot K_{g,c}(m,n)Og?(i,j)=c∈groupg?∑?m∑?n∑?Ic?(i+m,j+n)?Kg,c?(m,n)
優勢:
- 減少參數量和計算量
- 促進特征多樣性學習
- ResNeXt、ShuffleNet基礎
7. 混洗分組卷積
在分組卷積后添加通道混洗操作:
- 分組卷積
- 重組通道:將不同組的特征混合
實現步驟:
作用:增強組間信息交流,提升特征融合能力
8. 扁平卷積
使用1×1卷積核進行通道變換:
- 數學運算:O(i,j,c)=∑k=0Cin?1I(i,j,k)?W(c,k)O(i,j,c) = \sum_{k=0}^{C_{in}-1} I(i,j,k) \cdot W(c,k)O(i,j,c)=∑k=0Cin??1?I(i,j,k)?W(c,k)
- 作用:
- 降維/升維
- 跨通道信息融合
- 保持空間分辨率
二、感受野
1. 感受野的概念
感受野指卷積網絡中單個神經元對應輸入圖像的區域大小。它反映了神經元能"看到"的原始輸入范圍。
計算示例:
層1: 3x3卷積 → 感受野=3x3
層2: 3x3卷積 → 感受野=5x5 (考慮重疊)
層3: 3x3卷積 → 感受野=7x7
2. 感受野的作用
特征抽象層次
網絡深度 | 感受野大小 | 特征抽象級別 |
---|---|---|
淺層 | 小 (3-7像素) | 邊緣、紋理 |
中層 | 中 (15-40像素) | 形狀、部件 |
深層 | 大 (>100像素) | 物體、場景 |
設計注意點
- 輸入尺寸匹配:最終層感受野應大于目標物體
- 架構優化:通過膨脹卷積高效擴大感受野
- 多尺度融合:組合不同感受野的特征(如FPN)
計算公式:
RFl=RFl?1+(kl?1)×∏i=1l?1siRF_{l} = RF_{l-1} + (k_l - 1) \times \prod_{i=1}^{l-1} s_iRFl?=RFl?1?+(kl??1)×i=1∏l?1?si?
其中:
- RFlRF_lRFl?:第 lll 層的感受野
- klk_lkl?:第 lll 層卷積核大小
- sis_isi?:第 iii 層步長
三、卷積神經網絡案例:CIFAR-10分類
1. 模型結構設計
2. 網絡模型定義
import torch.nn as nnclass CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(3, 64, 3, padding=1)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(64, 128, 3, padding=1)self.conv3 = nn.Conv2d(128, 256, 3, padding=1)self.gap = nn.AdaptiveAvgPool2d(1) # 全局平均池化self.fc = nn.Linear(256, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = F.relu(self.conv3(x))x = self.gap(x)x = x.view(-1, 256)x = self.fc(x)return x
3. 核心模塊解析
模塊 | 作用 | 數學原理 |
---|---|---|
卷積層 | 特征提取 | y=W?x+by = W \ast x + by=W?x+b |
ReLU | 引入非線性 | f(x)=max?(0,x)f(x) = \max(0,x)f(x)=max(0,x) |
最大池化 | 降維 | y=max?(xi:i+k,j:j+k)y = \max(x_{i:i+k,j:j+k})y=max(xi:i+k,j:j+k?) |
全局平均池化 | 空間信息聚合 | yc=1H×W∑i∑jxc,i,jy_c = \frac{1}{H \times W} \sum_i \sum_j x_{c,i,j}yc?=H×W1?∑i?∑j?xc,i,j? |
Softmax | 分類概率輸出 | pc=ezc∑kezkp_c = \frac{e^{z_c}}{\sum_{k} e^{z_k}}pc?=∑k?ezk?ezc?? |
4. CIFAR-10數據集
-
10類物體(飛機、汽車、鳥等)
-
50,000訓練圖像 + 10,000測試圖像
-
分辨率32×32 RGB
-
數據加載:
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ])trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
5. 數據增強策略
train_transform = transforms.Compose([transforms.RandomHorizontalFlip(), # 隨機水平翻轉transforms.RandomRotation(15), # 隨機旋轉(-15°~15°)transforms.ColorJitter( # 顏色調整brightness=0.2, contrast=0.2, saturation=0.2),transforms.RandomResizedCrop(32, scale=(0.8, 1.0)), # 隨機縮放裁剪transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
6. 模型訓練與保存
model = CNN().cuda()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)for epoch in range(50):for inputs, labels in train_loader:inputs, labels = inputs.cuda(), labels.cuda()# 前向傳播outputs = model(inputs)loss = criterion(outputs, labels)# 反向傳播optimizer.zero_grad()loss.backward()optimizer.step()# 每10輪保存一次if epoch % 10 == 0:torch.save(model.state_dict(), f'model_epoch_{epoch}.pth')
7. 模型驗證流程
model.load_state_dict(torch.load('best_model.pth'))
model.eval() # 切換到評估模式correct = 0
total = 0with torch.no_grad():for images, labels in test_loader:images, labels = images.cuda(), labels.cuda()outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'準確率: {100 * correct / total}%')
8. 實時訓練可視化
使用TensorBoard記錄:
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter()for epoch in range(epochs):# ...訓練循環...writer.add_scalar('Loss/train', loss.item(), epoch)writer.add_scalar('Accuracy/train', acc, epoch)# 可視化卷積核if epoch % 5 == 0:for name, param in model.named_parameters():if 'conv' in name and 'weight' in name:writer.add_histogram(name, param, epoch)writer.add_images(f'{name}_kernels', param.data[:8].unsqueeze(1), epoch)
關鍵概念總結
卷積類型對比
卷積類型 | 參數量 | 計算量 | 適用場景 |
---|---|---|---|
標準卷積 | 高 | 高 | 通用模型 |
深度可分離 | 極低 | 極低 | 移動端模型 |
膨脹卷積 | 不變 | 不變 | 語義分割 |
分組卷積 | 減少 | 減少 | 高效模型 |
反卷積 | 高 | 高 | 生成模型 |
感受野計算表
層 | 核大小 | 步長 | 感受野 |
---|---|---|---|
Conv1 | 3 | 1 | 3 |
Pool1 | 2 | 2 | 4 |
Conv2 | 3 | 1 | 8 |
Pool2 | 2 | 2 | 12 |
Conv3 | 3 | 1 | 20 |