并行连结的网络GoogLeNet

37 篇文章 1 订阅
27 篇文章 1 订阅

1. Inception模块

Inception模块是GoogLeNet网络的核心部分,它是一种多分支卷积神经网络结构。Inception模块通过在不同尺度上使用不同大小的卷积核和池化核,来提取图像的多尺度特征。这种多分支的结构可以使网络在保持计算量相对较小的同时,提高网络的准确率。

Inception模块的结构如下图所示:

Input
1x1 Convolution
1x1 Convolution
1x1 Convolution
3x3 Convolution
5x5 Convolution
Concatenation

Inception模块的设计思路是通过并行连结不同大小的卷积核和池化层,来捕捉不同尺度的特征信息。具体来说,Inception模块包含了1x1、3x3、5x5的卷积核和3x3的池化层,然后将它们的输出在通道维度上进行拼接,形成输出张量。

假设输入张量为 X X X,经过Inception模块后得到的输出张量为 Y Y Y,则Inception模块的计算过程可以表示为:

Y = concat ( C o n v 1 x 1 ( X ) , C o n v 3 x 3 ( X ) , C o n v 5 x 5 ( X ) , P o o l 3 x 3 ( X ) ) Y = \text{concat}(Conv_{1x1}(X), Conv_{3x3}(X), Conv_{5x5}(X), Pool_{3x3}(X)) Y=concat(Conv1x1(X),Conv3x3(X),Conv5x5(X),Pool3x3(X))

其中, concat \text{concat} concat表示在通道维度上进行拼接, C o n v 1 x 1 ( X ) Conv_{1x1}(X) Conv1x1(X) C o n v 3 x 3 ( X ) Conv_{3x3}(X) Conv3x3(X) C o n v 5 x 5 ( X ) Conv_{5x5}(X) Conv5x5(X) P o o l 3 x 3 ( X ) Pool_{3x3}(X) Pool3x3(X)分别表示对输入张量 X X X进行1x1卷积、3x3卷积、5x5卷积和3x3池化操作得到的输出张量。

对于1x1卷积,其计算公式为:

C o n v 1 x 1 ( X ) i , j , k = ∑ c = 1 C W 1 , c , k X i , j , c + b k Conv_{1x1}(X)_{i,j,k} = \sum_{c=1}^{C}W_{1,c,k}X_{i,j,c}+b_k Conv1x1(X)i,j,k=c=1CW1,c,kXi,j,c+bk

其中, W 1 , c , k W_{1,c,k} W1,c,k表示1x1卷积核的第 c c c个通道和第 k k k个通道之间的权重, b k b_k bk表示第 k k k个通道的偏置。

对于3x3卷积,其计算公式为:

C o n v 3 x 3 ( X ) i , j , k = ∑ p = − 1 1 ∑ q = − 1 1 ∑ c = 1 C W 3 , p , q , c , k X i + p , j + q , c + b k Conv_{3x3}(X)_{i,j,k} = \sum_{p=-1}^{1}\sum_{q=-1}^{1}\sum_{c=1}^{C}W_{3,p,q,c,k}X_{i+p,j+q,c}+b_k Conv3x3(X)i,j,k=p=11q=11c=1CW3,p,q,c,kXi+p,j+q,c+bk

其中, W 3 , p , q , c , k W_{3,p,q,c,k} W3,p,q,c,k表示3x3卷积核的第 c c c个通道、第 p p p行、第 q q q列和第 k k k个通道之间的权重, b k b_k bk表示第 k k k个通道的偏置。

对于5x5卷积,其计算公式为:

C o n v 5 x 5 ( X ) i , j , k = ∑ p = − 2 2 ∑ q = − 2 2 ∑ c = 1 C W 5 , p , q , c , k X i + p , j + q , c + b k Conv_{5x5}(X)_{i,j,k} = \sum_{p=-2}^{2}\sum_{q=-2}^{2}\sum_{c=1}^{C}W_{5,p,q,c,k}X_{i+p,j+q,c}+b_k Conv5x5(X)i,j,k=p=22q=22c=1CW5,p,q,c,kXi+p,j+q,c+bk

其中, W 5 , p , q , c , k W_{5,p,q,c,k} W5,p,q,c,k表示5x5卷积核的第 c c c个通道、第 p p p行、第 q q q列和第 k k k个通道之间的权重, b k b_k bk表示第 k k k个通道的偏置。

对于3x3池化,其计算公式为:

P o o l 3 x 3 ( X ) i , j , k = max ⁡ p = − 1 1 max ⁡ q = − 1 1 X i + p , j + q , k Pool_{3x3}(X)_{i,j,k} = \max_{p=-1}^{1}\max_{q=-1}^{1}X_{i+p,j+q,k} Pool3x3(X)i,j,k=p=1max1q=1max1Xi+p,j+q,k

最后,将四个输出张量在通道维度上进行拼接,得到输出张量 Y Y Y

具体数值的公式推导例子

假设输入张量 X X X的形状为 3 × 224 × 224 3\times 224\times 224 3×224×224,且假设 C o n v 1 x 1 ( X ) Conv_{1x1}(X) Conv1x1(X) C o n v 3 x 3 ( X ) Conv_{3x3}(X) Conv3x3(X) C o n v 5 x 5 ( X ) Conv_{5x5}(X) Conv5x5(X) P o o l 3 x 3 ( X ) Pool_{3x3}(X) Pool3x3(X)的输出通道数分别为 64 64 64 128 128 128 32 32 32 32 32 32,则Inception模块的计算过程可以表示为:

Y = concat ( C o n v 1 x 1 ( X ) , C o n v 3 x 3 ( X ) , C o n v 5 x 5 ( X ) , P o o l 3 x 3 ( X ) ) = concat ( C o n v 1 x 1 ( X ) , C o n v 3 x 3 ( X ) , C o n v 5 x 5 ( X ) , P o o l 3 x 3 ( X ) ) 64 + 128 + 32 + 32 × 3 × 3 = concat ( C o n v 1 x 1 ( X ) 64 × 224 × 224 , C o n v 3 x 3 ( X ) 128 × 224 × 224 , C o n v 5 x 5 ( X ) 32 × 224 × 224 , P o o l 3 x 3 ( X ) 32 × 74 × 74 ) = [ C o n v 1 x 1 ( X ) 64 × 224 × 224 C o n v 3 x 3 ( X ) 128 × 224 × 224 C o n v 5 x 5 ( X ) 32 × 224 × 224 P o o l 3 x 3 ( X ) 32 × 74 × 74 ] \begin{aligned} Y &= \text{concat}(Conv_{1x1}(X), Conv_{3x3}(X), Conv_{5x5}(X), Pool_{3x3}(X)) \\ &= \text{concat}(Conv_{1x1}(X), Conv_{3x3}(X), Conv_{5x5}(X), Pool_{3x3}(X))_{64+128+32+32\times 3\times 3} \\ &= \text{concat}(Conv_{1x1}(X)_{64\times 224\times 224}, Conv_{3x3}(X)_{128\times 224\times 224}, Conv_{5x5}(X)_{32\times 224\times 224}, Pool_{3x3}(X)_{32\times 74\times 74}) \\ &= \begin{bmatrix} Conv_{1x1}(X)_{64\times 224\times 224} \\ Conv_{3x3}(X)_{128\times 224\times 224} \\ Conv_{5x5}(X)_{32\times 224\times 224} \\ Pool_{3x3}(X)_{32\times 74\times 74} \end{bmatrix} \end{aligned} Y=concat(Conv1x1(X),Conv3x3(X),Conv5x5(X),Pool3x3(X))=concat(Conv1x1(X),Conv3x3(X),Conv5x5(X),Pool3x3(X))64+128+32+32×3×3=concat(Conv1x1(X)64×224×224,Conv3x3(X)128×224×224,Conv5x5(X)32×224×224,Pool3x3(X)32×74×74)= Conv1x1(X)64×224×224Conv3x3(X)128×224×224Conv5x5(X)32×224×224Pool3x3(X)32×74×74

其中, C o n v 1 x 1 ( X ) 64 × 224 × 224 Conv_{1x1}(X)_{64\times 224\times 224} Conv1x1(X)64×224×224 C o n v 3 x 3 ( X ) 128 × 224 × 224 Conv_{3x3}(X)_{128\times 224\times 224} Conv3x3(X)128×224×224 C o n v 5 x 5 ( X ) 32 × 224 × 224 Conv_{5x5}(X)_{32\times 224\times 224} Conv5x5(X)32×224×224 P o o l 3 x 3 ( X ) 32 × 74 × 74 Pool_{3x3}(X)_{32\times 74\times 74} Pool3x3(X)32×74×74分别表示对输入张量 X X X进行1x1卷积、3x3卷积、5x5卷积和3x3池化操作得到的输出张量。具体的计算过程可以通过将输入张量 X X X和卷积核张量 W W W带入上述卷积和池化的计算公式中进行计算。

下面是Inception模块的结构图,使用Mermaid代码绘制:

Input
1x1 Convolution
3x3 Convolution
5x5 Convolution
3x3 Pooling
Concatenation
Output

其中, X X X表示输入张量, C o n v 1 x 1 Conv1x1 Conv1x1 C o n v 3 x 3 Conv3x3 Conv3x3 C o n v 5 x 5 Conv5x5 Conv5x5 P o o l 3 x 3 Pool3x3 Pool3x3分别表示对输入张量进行1x1卷积、3x3卷积、5x5卷积和3x3池化操作, C o n c a t Concat Concat表示在通道维度上进行拼接, Y Y Y表示输出张量。

下面我们将分别介绍每个分支的具体实现。

2. 1x1卷积分支

1 × 1 1\times1 1×1卷积分支是Inception模块中最简单的分支,它只包含一个 1 × 1 1\times1 1×1卷积层。这个卷积层的作用是对输入数据进行降维,从而减少计算量。 1 × 1 1\times1 1×1卷积分支的结构如下图所示:

Input
1x1 Convolution

3. 3 × 3 3\times3 3×3卷积分支

3 × 3 3\times3 3×3卷积分支用来提取输入数据的 3 × 3 3\times3 3×3的局部特征。这个分支包含了一个 1 × 1 1\times1 1×1卷积层和一个 3 × 3 3\times3 3×3卷积层。 1 × 1 1\times1 1×1卷积层的作用和 1 × 1 1\times1 1×1卷积分支一样,用来降低输入数据的通道数。 3 × 3 3\times3 3×3卷积层用来提取输入数据的 3 × 3 3\times3 3×3的局部特征。 3 × 3 3\times3 3×3卷积分支的结构如下图所示:

Input
1x1 Convolution
3x3 Convolution

4. 5 × 5 5\times5 5×5卷积分支

5 × 5 5\times5 5×5卷积分支用来提取输入数据的 5 × 5 5\times5 5×5的局部特征。这个分支包含了一个 1 × 1 1\times1 1×1卷积层和一个 5 × 5 5\times5 5×5卷积层。 1 × 1 1\times1 1×1卷积层的作用和 1 × 1 1\times1 1×1卷积分支一样,用来降低输入数据的通道数。 5 × 5 5\times5 5×5卷积层用来提取输入数据的 5 × 5 5\times5 5×5的局部特征。 5 × 5 5\times5 5×5卷积分支的结构如下图所示:

Input
1x1 Convolution
5x5 Convolution

5. 3 × 3 3\times3 3×3最大池化分支

3 × 3 3\times3 3×3最大池化分支用来提取输入数据的空间信息。这个分支包含了一个 3 × 3 3\times3 3×3的最大池化层。 3 × 3 3\times3 3×3最大池化分支的结构如下图所示:

Input
3x3 Max Pooling

6. 拼接分支

最后,将四个分支的输出在通道维度上进行拼接,得到Inception模块的输出。拼接分支的结构如下图所示:

1x1 Convolution
Concatenation
3x3 Convolution
5x5 Convolution
3x3 Max Pooling
Output

7. 代码实现

下面是使用PyTorch实现Inception模块的代码:

import torch.nn as nn

class InceptionModule(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(InceptionModule, self).__init__()
        self.conv1x1 = nn.Conv2d(in_channels, out_channels[0], kernel_size=1)
        self.conv3x3_reduce = nn.Conv2d(in_channels, out_channels[1], kernel_size=1)
        self.conv3x3 = nn.Conv2d(out_channels[1], out_channels[2], kernel_size=3, padding=1)
        self.conv5x5_reduce = nn.Conv2d(in_channels, out_channels[3], kernel_size=1)
        self.conv5x5 = nn.Conv2d(out_channels[3], out_channels[4], kernel_size=5, padding=2)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
    
    def forward(self, x):
        out1 = self.conv1x1(x)
        out2 = self.conv3x3_reduce(x)
        out2 = self.conv3x3(out2)
        out3 = self.conv5x5_reduce(x)
        out3 = self.conv5x5(out3)
        out4 = self.maxpool(x)
        out4 = self.conv1x1(out4)
        out = torch.cat([out1, out2, out3, out4], dim=1)
        return out

8. 总结

Inception模块是一种多分支卷积神经网络结构,可以在不同尺度上使用不同大小的卷积核和池化核,来提取图像的多尺度特征。这种多分支的结构可以使网络在保持计算量相对较小的同时,提高网络的准确率。在实现Inception模块时,我们可以使用PyTorch提供的卷积层和池化层来实现各个分支,然后在通道维度上进行拼接,得到Inception模块的输出。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值