目录
1. Inception模块
Inception模块是GoogLeNet网络的核心部分,它是一种多分支卷积神经网络结构。Inception模块通过在不同尺度上使用不同大小的卷积核和池化核,来提取图像的多尺度特征。这种多分支的结构可以使网络在保持计算量相对较小的同时,提高网络的准确率。
Inception模块的结构如下图所示:
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=1∑CW1,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=−1∑1q=−1∑1c=1∑CW3,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=−2∑2q=−2∑2c=1∑CW5,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代码绘制:
其中, 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卷积分支的结构如下图所示:
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卷积分支的结构如下图所示:
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卷积分支的结构如下图所示:
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最大池化分支的结构如下图所示:
6. 拼接分支
最后,将四个分支的输出在通道维度上进行拼接,得到Inception模块的输出。拼接分支的结构如下图所示:
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模块的输出。