【动手学深度学习】--15.含并行连结的网络GoogLeNet
发布人:shili8
发布时间:2025-02-04 06:17
阅读次数:0
**动手学深度学习 --15. 含并行连接的网络 GoogLeNet**
在前面的章节中,我们已经学习了多种深度学习模型,如卷积神经网络(CNN)、残差网络(ResNet)等。然而,GoogLeNet是另一种非常有趣且实用的网络结构,它能够有效地利用并行连接来提高计算效率。
**1. GoogLeNet 的基本结构**
GoogLeNet 由多个模块组成,每个模块都包含一个卷积层和一个池化层。这些模块之间通过并行连接进行关联,形成了一个深度网络。
下图是 GoogLeNet 的基本结构:
+---------------+ | Conv2d_1a | +---------------+ | | v +---------------+ | MaxPool2d_1a | +---------------+ | | v +---------------+---------------+ | Inception_3b | Inception_4e | +---------------+---------------+ | | | | v v +---------------+---------------+ | MaxPool2d_5a | MaxPool2d_6a | +---------------+---------------+ | | v +---------------+ | Conv2d_7b | +---------------+
**2. Inception 模块**
Inception 模块是 GoogLeNet 的核心部分,它包含三个并行连接的卷积层和池化层。每个卷积层都有不同的尺寸和数量。
下图是 Inception 模块的结构:
+---------------+---------------+---------------+ | Conv2d_1x1 | Conv2d_3x3 | Conv2d_5x5 | +---------------+---------------+---------------+ | | | v v v +---------------+---------------+---------------+ | MaxPool2d_3x3 | MaxPool2d_3x3 | MaxPool2d_3x3 | +---------------+---------------+---------------+
**3. GoogLeNet 的实现**
下面是 GoogLeNet 的 PyTorch 实现:
import torchimport torch.nn as nnclass GoogLeNet(nn.Module): def __init__(self): super(GoogLeNet, self).__init__() self.conv1 = nn.Conv2d(3,64, kernel_size=7, stride=2, padding=3) self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) self.inception3b = InceptionModule(64,128,192,256) self.maxpool3 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) self.inception4e = InceptionModule(512,1024,1536,2048) def forward(self, x): x = self.conv1(x) x = self.maxpool1(x) x = self.inception3b(x) x = self.maxpool3(x) x = self.inception4e(x) return xclass InceptionModule(nn.Module): def __init__(self, in_channels, out_channels_1x1, out_channels_3x3, out_channels_5x5): super(InceptionModule, self).__init__() self.conv1x1 = nn.Conv2d(in_channels, out_channels_1x1, kernel_size=1) self.conv3x3 = nn.Conv2d(in_channels, out_channels_3x3, kernel_size=3, padding=1) self.conv5x5 = nn.Conv2d(in_channels, out_channels_5x5, kernel_size=5, padding=2) def forward(self, x): x1 = self.conv1x1(x) x2 = self.conv3x3(x) x3 = self.conv5x5(x) return torch.cat((x1, x2, x3), dim=1)
**4. 训练和测试**
下面是如何训练和测试 GoogLeNet:
# 初始化模型和损失函数model = GoogLeNet() criterion = nn.CrossEntropyLoss() # 初始化优化器optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练模型for epoch in range(10): for x, y in train_loader: optimizer.zero_grad() output = model(x) loss = criterion(output, y) loss.backward() optimizer.step() # 测试模型model.eval() with torch.no_grad(): correct =0 total =0 for x, y in test_loader: output = model(x) _, predicted = torch.max(output, dim=1) total += y.size(0) correct += (predicted == y).sum().item() accuracy = correct / totalprint('Test accuracy: {:.2f}%'.format(100. * accuracy))
**5. 总结**
GoogLeNet 是一种非常有趣且实用的网络结构,它能够有效地利用并行连接来提高计算效率。通过使用 Inception 模块和 MaxPool2d 层,GoogLeNet 能够实现高准确率的图像分类任务。