Python训练营打卡 Day54
Inception网络及其思考
知识点回顾:
- 传统计算机视觉发展史:LeNet-->AlexNet-->VGGNet-->nceptionNet-->ResNet,之所以说传统,是因为现在主要是针对backbone-neck-head这样的范式做文章
- inception模块和网络
- 特征融合方法阶段性总结:逐元素相加、逐元素相乘、concat通道数增加等
- 感受野与卷积核变体:深入理解不同模块和类的设计初衷
Inception 网络及其思考
知识点回顾
-
传统计算机视觉发展史:
-
LeNet:像是早期的简单食谱,为后续复杂模型奠定基础。
-
AlexNet:引入了深度和ReLU激活函数,如同在厨房中引入了新的烹饪工具和方法。
-
VGGNet:通过增加网络深度来提升性能,如同增加菜谱的步骤以丰富菜品。
-
InceptionNet:引入多尺度特征提取,如同在烹饪中考虑不同食材的处理方式。
-
ResNet:引入残差连接解决梯度消失问题,如同在厨房中引入新的流程优化方法。
-
-
Inception 模块和网络:
-
Inception 模块通过多分支结构提取不同尺度的特征,类似在厨房中使用多种工具同时处理食材以提高效率。
-
网络由多个 Inception 模块堆叠而成,类似于多个高效工作站的组合。
-
-
特征融合方法阶段性总结:
-
逐元素相加:如同将多种处理过的食材按特定方式混合,使味道相互补充。
-
逐元素相乘:如同根据特定比例混合食材,使味道相互增强。
-
Concat 通道数增加:如同将多种食材的特性拼接在一起,形成丰富的菜品。
-
-
感受野与卷积核变体:
-
感受野决定了模型能“看到”的输入区域大小,类似于厨师的视野范围决定其对菜品的整体把控。
-
不同大小的卷积核用于提取不同尺度的特征,如同使用不同尺寸的刀具切割食材以适应不同的烹饪需求。
-
作业:一次稍微有点学术感觉的作业:
- 对inception网络在cifar10上观察精度
- 消融实验:引入残差机制和cbam模块分别进行消融
作业
对 Inception 网络在 CIFAR-10 上观察精度,并进行消融实验:引入残差机制和 CBAM 模块分别进行消融。
-
引入残差机制:如同在原有菜谱中增加一种新的调味方法,以提升菜品的口感层次。
-
引入 CBAM 模块:如同在厨房中增加智能设备,动态调整每一步骤的火力和时间,以提升菜品质量。
-
消融实验:通过比较不同配置下的模型性能,了解每个模块对整体效果的贡献,如同测试不同烹饪步骤对菜品质量的影响。
class CBAM(nn.Module):def __init__(self, in_channels, reduction_ratio=16):super(CBAM, self).__init__()# 通道注意力self.channel_attention = nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Conv2d(in_channels, in_channels // reduction_ratio, kernel_size=1),nn.ReLU(),nn.Conv2d(in_channels // reduction_ratio, in_channels, kernel_size=1),nn.Sigmoid())# 空间注意力self.spatial_attention = nn.Sequential(nn.Conv2d(2, 1, kernel_size=7, padding=3),nn.Sigmoid())def forward(self, x):channel_attention = self.channel_attention(x)x = x * channel_attentionspatial_attention = self.spatial_attention(torch.cat([torch.mean(x, dim=1, keepdim=True), torch.max(x, dim=1, keepdim=True)[0]], dim=1))x = x * spatial_attentionreturn xclass InceptionWithCBAM(nn.Module):def __init__(self, in_channels):super(InceptionWithCBAM, self).__init__()self.branch1x1 = nn.Sequential(nn.Conv2d(in_channels, 64, kernel_size=1),nn.ReLU())self.branch3x3 = nn.Sequential(nn.Conv2d(in_channels, 96, kernel_size=1),nn.ReLU(),nn.Conv2d(96, 128, kernel_size=3, padding=1),nn.ReLU())self.branch5x5 = nn.Sequential(nn.Conv2d(in_channels, 16, kernel_size=1),nn.ReLU(),nn.Conv2d(16, 32, kernel_size=5, padding=2),nn.ReLU())self.branch_pool = nn.Sequential(nn.MaxPool2d(kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels, 32, kernel_size=1),nn.ReLU())self.cbam = CBAM(256)def forward(self, x):branch1x1 = self.branch1x1(x)branch3x3 = self.branch3x3(x)branch5x5 = self.branch5x5(x)branch_pool = self.branch_pool(x)outputs = [branch1x1, branch3x3, branch5x5, branch_pool]x = torch.cat(outputs, dim=1)x = self.cbam(x)return xclass InceptionNetWithCBAM(nn.Module):def __init__(self, num_classes=10):super(InceptionNetWithCBAM, self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))self.inception1 = InceptionWithCBAM(64)self.inception2 = InceptionWithCBAM(256)self.avgpool = nn.AdaptiveAvgPool2d((1, 1))self.fc = nn.Linear(256, num_classes)def forward(self, x):x = self.conv1(x)x = self.inception1(x)x = self.inception2(x)x = self.avgpool(x)x = torch.flatten(x, 1)x = self.fc(x)return x# 主函数
def main_cbam():device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = InceptionNetWithCBAM().to(device)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)for epoch in range(5):train(model, device, trainloader, criterion, optimizer, epoch)test(model, device, testloader)if __name__ == "__main__":main_cbam()
实验结果分析
通过比较基础 Inception 网络、引入残差机制的 Inception 网络,以及引入 CBAM 模块的 Inception 网络在 CIFAR-10 数据集上的准确率,可以得出以下结论:
-
基础 Inception 网络:提供了多尺度特征提取的能力,能够有效捕捉不同尺度的特征。
-
引入残差机制:通过残差连接,缓解了深层网络的梯度消失问题,提高了模型的训练效率和性能。
-
引入 CBAM 模块:通过通道和空间注意力机制,增强了模型对关键特征的关注能力,进一步提高了模型的性能。
@浙大疏锦行