第J8周:Inception v1算法实战与解析

Inception v1 论文
Going deeper with convolutions.pdf

一、 理论知识 

GoogLeNet首次出现在2014年ILSVRC 比赛中获得冠军。这次的版本通常称其为Inception V1。Inception V1有22层深,参数量为5M。同一时期的VGGNet性能和Inception V1差不多,但是参数量也是远大于Inception V1。

Inception Module是Inception V1的核心组成单元,提出了卷积层的并行结构,实现了在同一层就可以提取不同的特征,如下图。

按照这样的结构来增加网络的深度,虽然可以提升性能,但是还面临计算量大(参数多)的问题。为改善这种现象,Inception Module借鉴Network-in-Network的思想,使用1x1的卷积核实现降维操作(也间接增加了网络的深度),以此来减小网络的参数量与计算量,如上图b所示。

备注举例:假如前一层的输出为100x100x128,经过具有256个5x5卷积核的卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为5x5x128x256+256。假如上一层输出先经过具有32个1x1卷积核的卷积层(1x1卷积降低了通道数,且特征图尺寸不变),再经过具有256个5x5卷积核的卷积层,最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32+32 + 32x5x5x256+256,参数数量减少为原来的约4分之一

1x1卷积核的作用: 1x1卷积核的最大作用是降低输入特征图的通道数,减小网络的参数量与计算量。

最后Inception Module基本由11卷积,33卷积,55卷积,33最大池化四个基本单元组成,对四个基本单元运算结果进行通道上组合,不同大小的卷积核赋予不同大小的感受野,从而提取到图像不同尺度的信息,进行融合,得到图像更好的表征, 就是Inception Module的核心思想。

二、算法结构

实现的Inception V1网络结构图如下: 

 

注:另外增加了两个辅助分支,作用有两点,一是为了避免梯度消失,用于向前传导梯度。反向传播时如果有一层求导为0,链式求导结果则为0。二是将中间某一层输出用作分类,起到模型融合作用,实际测试时,这两个辅助softmax分支会被去掉,在后续模型的发展中,该方法被采用较少,可以直接绕过,重点学习卷积层的并行结构与1x1卷积核部分的内容即可。

详细网络结构图如下: 

三、Pytorch复现

下面的代码是参考上方表格中的网络框架和参数实现的 

Inception Module的代码实现 

''' InceptionV1 '''
class InceptionV1(nn.Module):
    def __init__(self,
                 include_top=True,  # 是否包含位于网络顶部的全链接层
                 preact=False,      # 是否使用预激活
                 use_bias=True,     # 是否对卷积层使用偏置
                 input_shape=[3, 224, 224],
                 classes=1000,
                 pooling=None):     # 用于分类图像的可选类数
        super(InceptionV1, self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(64, 64, kernel_size=1, stride=1, padding=0),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 192, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        )
        self.conv3 = nn.Sequential(
            InceptionBlock(192, 64, [96,128], [16,32], 32),
            InceptionBlock(256, 128, [128,192], [32,96], 64),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        )
        self.conv4 = nn.Sequential(
            InceptionBlock(480, 192, [96,208], [16,48], 64),
            InceptionBlock(512, 160, [112,224], [24,64], 64),
            InceptionBlock(512, 128, [128,256], [24,64], 64),
            InceptionBlock(512, 112, [144,288], [32,64], 64),
            InceptionBlock(528, 256, [160,320], [32,128], 128),
            nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        )
        self.conv5 = nn.Sequential(
            InceptionBlock(832, 256, [160,320], [32,128], 128),
            InceptionBlock(832, 384, [192,384], [48,128], 128),
            nn.AvgPool2d(kernel_size=7,stride=1,padding=0),
            nn.Dropout(0.4)
        )
        self.fc = nn.Sequential(
            nn.Flatten(),
            nn.Linear(in_features=1024, out_features=1024),
            nn.ReLU(inplace=True),
            nn.Linear(in_features=1024, out_features=classes),
            nn.Softmax(dim=1)
        )
    
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.conv5(x)
        x = self.fc(x)
        return x

 模型打印

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,472
              ReLU-2         [-1, 64, 112, 112]               0
         MaxPool2d-3           [-1, 64, 56, 56]               0
            Conv2d-4           [-1, 64, 56, 56]           4,160
              ReLU-5           [-1, 64, 56, 56]               0
            Conv2d-6          [-1, 192, 56, 56]         110,784
              ReLU-7          [-1, 192, 56, 56]               0
         MaxPool2d-8          [-1, 192, 28, 28]               0
            Conv2d-9           [-1, 64, 28, 28]          12,352
      BatchNorm2d-10           [-1, 64, 28, 28]             128
             ReLU-11           [-1, 64, 28, 28]               0
           Conv2d-12           [-1, 96, 28, 28]          18,528
      BatchNorm2d-13           [-1, 96, 28, 28]             192
             ReLU-14           [-1, 96, 28, 28]               0
           Conv2d-15          [-1, 128, 28, 28]         110,720
      BatchNorm2d-16          [-1, 128, 28, 28]             256
             ReLU-17          [-1, 128, 28, 28]               0
           Conv2d-18           [-1, 16, 28, 28]           3,088
      BatchNorm2d-19           [-1, 16, 28, 28]              32
             ReLU-20           [-1, 16, 28, 28]               0
           Conv2d-21           [-1, 32, 28, 28]          12,832
      BatchNorm2d-22           [-1, 32, 28, 28]              64
             ReLU-23           [-1, 32, 28, 28]               0
        MaxPool2d-24          [-1, 192, 28, 28]               0
           Conv2d-25           [-1, 32, 28, 28]           6,176
      BatchNorm2d-26           [-1, 32, 28, 28]              64
             ReLU-27           [-1, 32, 28, 28]               0
   InceptionBlock-28          [-1, 256, 28, 28]               0
           Conv2d-29          [-1, 128, 28, 28]          32,896
      BatchNorm2d-30          [-1, 128, 28, 28]             256
             ReLU-31          [-1, 128, 28, 28]               0
           Conv2d-32          [-1, 128, 28, 28]          32,896
      BatchNorm2d-33          [-1, 128, 28, 28]             256
             ReLU-34          [-1, 128, 28, 28]               0
           Conv2d-35          [-1, 192, 28, 28]         221,376
      BatchNorm2d-36          [-1, 192, 28, 28]             384
             ReLU-37          [-1, 192, 28, 28]               0
           Conv2d-38           [-1, 32, 28, 28]           8,224
      BatchNorm2d-39           [-1, 32, 28, 28]              64
             ReLU-40           [-1, 32, 28, 28]               0
           Conv2d-41           [-1, 96, 28, 28]          76,896
      BatchNorm2d-42           [-1, 96, 28, 28]             192
             ReLU-43           [-1, 96, 28, 28]               0
        MaxPool2d-44          [-1, 256, 28, 28]               0
           Conv2d-45           [-1, 64, 28, 28]          16,448
      BatchNorm2d-46           [-1, 64, 28, 28]             128
             ReLU-47           [-1, 64, 28, 28]               0
   InceptionBlock-48          [-1, 480, 28, 28]               0
        MaxPool2d-49          [-1, 480, 14, 14]               0
           Conv2d-50          [-1, 192, 14, 14]          92,352
      BatchNorm2d-51          [-1, 192, 14, 14]             384
             ReLU-52          [-1, 192, 14, 14]               0
           Conv2d-53           [-1, 96, 14, 14]          46,176
      BatchNorm2d-54           [-1, 96, 14, 14]             192
             ReLU-55           [-1, 96, 14, 14]               0
           Conv2d-56          [-1, 208, 14, 14]         179,920
      BatchNorm2d-57          [-1, 208, 14, 14]             416
             ReLU-58          [-1, 208, 14, 14]               0
           Conv2d-59           [-1, 16, 14, 14]           7,696
      BatchNorm2d-60           [-1, 16, 14, 14]              32
             ReLU-61           [-1, 16, 14, 14]               0
           Conv2d-62           [-1, 48, 14, 14]          19,248
      BatchNorm2d-63           [-1, 48, 14, 14]              96
             ReLU-64           [-1, 48, 14, 14]               0
        MaxPool2d-65          [-1, 480, 14, 14]               0
           Conv2d-66           [-1, 64, 14, 14]          30,784
      BatchNorm2d-67           [-1, 64, 14, 14]             128
             ReLU-68           [-1, 64, 14, 14]               0
   InceptionBlock-69          [-1, 512, 14, 14]               0
           Conv2d-70          [-1, 160, 14, 14]          82,080
      BatchNorm2d-71          [-1, 160, 14, 14]             320
             ReLU-72          [-1, 160, 14, 14]               0
           Conv2d-73          [-1, 112, 14, 14]          57,456
      BatchNorm2d-74          [-1, 112, 14, 14]             224
             ReLU-75          [-1, 112, 14, 14]               0
           Conv2d-76          [-1, 224, 14, 14]         226,016
      BatchNorm2d-77          [-1, 224, 14, 14]             448
             ReLU-78          [-1, 224, 14, 14]               0
           Conv2d-79           [-1, 24, 14, 14]          12,312
      BatchNorm2d-80           [-1, 24, 14, 14]              48
             ReLU-81           [-1, 24, 14, 14]               0
           Conv2d-82           [-1, 64, 14, 14]          38,464
      BatchNorm2d-83           [-1, 64, 14, 14]             128
             ReLU-84           [-1, 64, 14, 14]               0
        MaxPool2d-85          [-1, 512, 14, 14]               0
           Conv2d-86           [-1, 64, 14, 14]          32,832
      BatchNorm2d-87           [-1, 64, 14, 14]             128
             ReLU-88           [-1, 64, 14, 14]               0
   InceptionBlock-89          [-1, 512, 14, 14]               0
           Conv2d-90          [-1, 128, 14, 14]          65,664
      BatchNorm2d-91          [-1, 128, 14, 14]             256
             ReLU-92          [-1, 128, 14, 14]               0
           Conv2d-93          [-1, 128, 14, 14]          65,664
      BatchNorm2d-94          [-1, 128, 14, 14]             256
             ReLU-95          [-1, 128, 14, 14]               0
           Conv2d-96          [-1, 256, 14, 14]         295,168
      BatchNorm2d-97          [-1, 256, 14, 14]             512
             ReLU-98          [-1, 256, 14, 14]               0
           Conv2d-99           [-1, 24, 14, 14]          12,312
     BatchNorm2d-100           [-1, 24, 14, 14]              48
            ReLU-101           [-1, 24, 14, 14]               0
          Conv2d-102           [-1, 64, 14, 14]          38,464
     BatchNorm2d-103           [-1, 64, 14, 14]             128
            ReLU-104           [-1, 64, 14, 14]               0
       MaxPool2d-105          [-1, 512, 14, 14]               0
          Conv2d-106           [-1, 64, 14, 14]          32,832
     BatchNorm2d-107           [-1, 64, 14, 14]             128
            ReLU-108           [-1, 64, 14, 14]               0
  InceptionBlock-109          [-1, 512, 14, 14]               0
          Conv2d-110          [-1, 112, 14, 14]          57,456
     BatchNorm2d-111          [-1, 112, 14, 14]             224
            ReLU-112          [-1, 112, 14, 14]               0
          Conv2d-113          [-1, 144, 14, 14]          73,872
     BatchNorm2d-114          [-1, 144, 14, 14]             288
            ReLU-115          [-1, 144, 14, 14]               0
          Conv2d-116          [-1, 288, 14, 14]         373,536
     BatchNorm2d-117          [-1, 288, 14, 14]             576
            ReLU-118          [-1, 288, 14, 14]               0
          Conv2d-119           [-1, 32, 14, 14]          16,416
     BatchNorm2d-120           [-1, 32, 14, 14]              64
            ReLU-121           [-1, 32, 14, 14]               0
          Conv2d-122           [-1, 64, 14, 14]          51,264
     BatchNorm2d-123           [-1, 64, 14, 14]             128
            ReLU-124           [-1, 64, 14, 14]               0
       MaxPool2d-125          [-1, 512, 14, 14]               0
          Conv2d-126           [-1, 64, 14, 14]          32,832
     BatchNorm2d-127           [-1, 64, 14, 14]             128
            ReLU-128           [-1, 64, 14, 14]               0
  InceptionBlock-129          [-1, 528, 14, 14]               0
          Conv2d-130          [-1, 256, 14, 14]         135,424
     BatchNorm2d-131          [-1, 256, 14, 14]             512
            ReLU-132          [-1, 256, 14, 14]               0
          Conv2d-133          [-1, 160, 14, 14]          84,640
     BatchNorm2d-134          [-1, 160, 14, 14]             320
            ReLU-135          [-1, 160, 14, 14]               0
          Conv2d-136          [-1, 320, 14, 14]         461,120
     BatchNorm2d-137          [-1, 320, 14, 14]             640
            ReLU-138          [-1, 320, 14, 14]               0
          Conv2d-139           [-1, 32, 14, 14]          16,928
     BatchNorm2d-140           [-1, 32, 14, 14]              64
            ReLU-141           [-1, 32, 14, 14]               0
          Conv2d-142          [-1, 128, 14, 14]         102,528
     BatchNorm2d-143          [-1, 128, 14, 14]             256
            ReLU-144          [-1, 128, 14, 14]               0
       MaxPool2d-145          [-1, 528, 14, 14]               0
          Conv2d-146          [-1, 128, 14, 14]          67,712
     BatchNorm2d-147          [-1, 128, 14, 14]             256
            ReLU-148          [-1, 128, 14, 14]               0
  InceptionBlock-149          [-1, 832, 14, 14]               0
       MaxPool2d-150            [-1, 832, 7, 7]               0
          Conv2d-151            [-1, 256, 7, 7]         213,248
     BatchNorm2d-152            [-1, 256, 7, 7]             512
            ReLU-153            [-1, 256, 7, 7]               0
          Conv2d-154            [-1, 160, 7, 7]         133,280
     BatchNorm2d-155            [-1, 160, 7, 7]             320
            ReLU-156            [-1, 160, 7, 7]               0
          Conv2d-157            [-1, 320, 7, 7]         461,120
     BatchNorm2d-158            [-1, 320, 7, 7]             640
            ReLU-159            [-1, 320, 7, 7]               0
          Conv2d-160             [-1, 32, 7, 7]          26,656
     BatchNorm2d-161             [-1, 32, 7, 7]              64
            ReLU-162             [-1, 32, 7, 7]               0
          Conv2d-163            [-1, 128, 7, 7]         102,528
     BatchNorm2d-164            [-1, 128, 7, 7]             256
            ReLU-165            [-1, 128, 7, 7]               0
       MaxPool2d-166            [-1, 832, 7, 7]               0
          Conv2d-167            [-1, 128, 7, 7]         106,624
     BatchNorm2d-168            [-1, 128, 7, 7]             256
            ReLU-169            [-1, 128, 7, 7]               0
  InceptionBlock-170            [-1, 832, 7, 7]               0
          Conv2d-171            [-1, 384, 7, 7]         319,872
     BatchNorm2d-172            [-1, 384, 7, 7]             768
            ReLU-173            [-1, 384, 7, 7]               0
          Conv2d-174            [-1, 192, 7, 7]         159,936
     BatchNorm2d-175            [-1, 192, 7, 7]             384
            ReLU-176            [-1, 192, 7, 7]               0
          Conv2d-177            [-1, 384, 7, 7]         663,936
     BatchNorm2d-178            [-1, 384, 7, 7]             768
            ReLU-179            [-1, 384, 7, 7]               0
          Conv2d-180             [-1, 48, 7, 7]          39,984
     BatchNorm2d-181             [-1, 48, 7, 7]              96
            ReLU-182             [-1, 48, 7, 7]               0
          Conv2d-183            [-1, 128, 7, 7]         153,728
     BatchNorm2d-184            [-1, 128, 7, 7]             256
            ReLU-185            [-1, 128, 7, 7]               0
       MaxPool2d-186            [-1, 832, 7, 7]               0
          Conv2d-187            [-1, 128, 7, 7]         106,624
     BatchNorm2d-188            [-1, 128, 7, 7]             256
            ReLU-189            [-1, 128, 7, 7]               0
  InceptionBlock-190           [-1, 1024, 7, 7]               0
       AvgPool2d-191           [-1, 1024, 1, 1]               0
         Dropout-192           [-1, 1024, 1, 1]               0
         Flatten-193                 [-1, 1024]               0
          Linear-194                 [-1, 1024]       1,049,600
            ReLU-195                 [-1, 1024]               0
          Linear-196                    [-1, 2]           2,050
         Softmax-197                    [-1, 2]               0
================================================================
Total params: 7,039,122
Trainable params: 7,039,122
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 81.87
Params size (MB): 26.85
Estimated Total Size (MB): 109.30
----------------------------------------------------------------
 

InceptionV1(
  (conv1): Sequential(
    (0): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3))
    (1): ReLU(inplace=True)
    (2): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  )
  (conv2): Sequential(
    (0): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))
    (1): ReLU(inplace=True)
    (2): Conv2d(64, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU(inplace=True)
    (4): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  )
  (conv3): Sequential(
    (0): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(96, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(192, 16, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (1): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(128, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(32, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (2): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  )
  (conv4): Sequential(
    (0): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(480, 192, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(480, 96, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(96, 208, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(208, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(480, 16, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(16, 48, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(480, 64, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (1): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(512, 160, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(112, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(112, 224, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(224, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(24, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (2): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(24, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (3): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(112, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(512, 144, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(144, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(144, 288, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(288, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (4): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(528, 256, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(528, 160, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(528, 32, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(32, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(528, 128, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (5): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  )
  (conv5): Sequential(
    (0): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(832, 256, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(832, 160, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(832, 32, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(32, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (1): InceptionBlock(
      (conv1): Sequential(
        (0): Conv2d(832, 384, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
      )
      (conv2): Sequential(
        (0): Conv2d(832, 192, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        (4): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv3): Sequential(
        (0): Conv2d(832, 48, kernel_size=(1, 1), stride=(1, 1))
        (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): ReLU(inplace=True)
        (3): Conv2d(48, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
        (4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): ReLU(inplace=True)
      )
      (conv4): Sequential(
        (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)
        (1): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1))
        (2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (3): ReLU(inplace=True)
      )
    )
    (2): AvgPool2d(kernel_size=7, stride=1, padding=0)
    (3): Dropout(p=0.4, inplace=False)
  )
  (fc): Sequential(
    (0): Flatten(start_dim=1, end_dim=-1)
    (1): Linear(in_features=1024, out_features=1024, bias=True)
    (2): ReLU(inplace=True)
    (3): Linear(in_features=1024, out_features=2, bias=True)
    (4): Softmax(dim=1)
  )
)
 

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值