??ResNet(Residual Networks)是深度學習中的一個重要架構,其創新點主要體現在解決了深層神經網絡訓練中的梯度消失和梯度爆炸問題,從而使得可以構建更深的神經網絡。以下是 ResNet 的創新點總結:
??1. 殘差連接(Skip Connections): ResNet 提出了殘差單元(Residual Unit),將輸入特征與輸出特征之間的差值作為主要學習目標,而不是直接學習輸出特征。這種殘差連接允許信息直接跳過一些層,從而在反向傳播中有效地傳遞梯度,減輕了梯度消失和梯度爆炸問題,使得可以訓練更深的網絡。
??2. 深度增加: ResNet 提出了堆疊多個殘差單元來構建深度網絡。相比于傳統的深層網絡,ResNet 通過殘差連接允許網絡加深,避免了過擬合和性能退化問題。
??3. 全局平均池化: ResNet 在網絡的最后不使用全連接層,而是使用全局平均池化層來進行空間信息的整合。這種方法減少了參數數量,減輕了過擬合風險,同時使得網絡對輸入圖像的尺寸變化更具有魯棒性。
??4. 預訓練和遷移學習: ResNet 在 ImageNet 數據集上進行了大規模預訓練,并且在多個計算機視覺任務上展現了出色的通用性能。這使得 ResNet 成為一個強大的特征提取器,可以用于遷移學習和微調,加速其他任務的訓練過程。
??5. 模型設計思想的影響: ResNet 提出了深度網絡的設計思想,為后續的網絡架構設計(如 DenseNet、Wide ResNet 等)提供了啟發和基礎。殘差連接的思想被廣泛應用于各種網絡架構中,為深度學習的發展產生了深遠影響。
??綜上所述,ResNet 的創新點主要在于引入了殘差連接,通過解決梯度問題使得可以構建更深的神經網絡,從而在計算機視覺任務中取得了重大突破。
??以下是一個簡化版的殘差連接的代碼示例,用于構建一個包含殘差塊的神經網絡。請注意,實際的 ResNet 網絡結構更加復雜,包含多個層和塊。
import torch
import torch.nn as nnclass ResidualBlock(nn.Module):def __init__(self, in_channels, out_channels, stride=1):super(ResidualBlock, self).__init__()# Main branchself.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1)self.bn1 = nn.BatchNorm2d(out_channels)self.relu = nn.ReLU(inplace=True)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(out_channels)# Shortcut connectionif stride != 1 or in_channels != out_channels:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride),nn.BatchNorm2d(out_channels))else:self.shortcut = nn.Identity()def forward(self, x):residual = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out += self.shortcut(x) # Residual connectionout = self.relu(out)return out# Create a sample residual block
sample_block = ResidualBlock(in_channels=64, out_channels=128, stride=2)
print(sample_block)
??上述代碼演示了如何構建一個簡單的殘差塊。在這個示例中,ResidualBlock
類包含了一個主要分支(兩個卷積層和批歸一化層)和一個短接連接(shortcut),用于將輸入特征與輸出特征相加。這個殘差塊可以用于構建更復雜的 ResNet 網絡。在實際應用中,ResNet 通常由多個這樣的殘差塊組成,以構建更深層次的神經網絡。