> 文档中心 > GoogLeNet

GoogLeNet


1. 前言

本文使用飞桨(PaddlePaddle)复现卷积神经网络GoogLeNet。
本人全部文章请参见:博客文章导航目录
本文归属于:卷积神经网络复现系列
前文:VGGNet

2. GoogLeNet模型结构

GoogLeNet是2014年ImageNet比赛的冠军,它的主要特点是网络不仅有深度,还在横向上具有“宽度”。GoogLeNet提出了一种被称为Inception的模块,该模块具有不同尺寸的卷积核,可以使用较大的卷积核提取空间分布范围更广的图像信息的特征,使用较小的卷积核提取空间分布范围较小的图像信息的特征。
Google的研究人员为了向LeNet致敬,特地将模型命名为GoogLeNet。GoogLeNet也被称为Inception V1,其中Inception一词来源于电影《盗梦空间》(Inception),Inception模块结构如下图所示:
图一
图一(a)是Inception模块的设计思想,使用3个不同大小的卷积核对输入图片进行卷积操作,并附加最大池化,将这4个操作的输出沿着通道这一维度进行拼接,构成的输出特征图将会包含经过不同大小的卷积核提取出来的特征,从而达到捕捉不同尺度信息的效果。
Inception模块采用多通路(multi-path)的设计形式,每个支路使用不同大小的卷积核,最终输出特征图的通道数是每个支路输出通道数的总和,这将会导致输出通道数变得很大,尤其是使用多个Inception模块串联操作的时候,模型参数量会变得非常大。为了减小参数量,Inception模块具体实现时使用了图一(b)中的设计方式,在每个3x3和5x5的卷积层之前,增加1x1的卷积层来控制输出通道数。同时在最大池化层后面增加1x1卷积层减小输出通道数。

GoogLeNet模型结构如图二所示,在主体卷积部分中使用了5个模块(block),每个模块之间使用步长为2的3×3最大池化层来减小输出高宽。

  • 第一模块使用一个64通道的7×7卷积层;
  • 第二模块使用2个卷积层:首先是64通道的1×1卷积层,然后是将通道增大3倍的3×3卷积层;
  • 第三模块串联2个Inception块;
  • 第四模块串联了5个Inception块;
  • 第五模块串联了2 个Inception块;
  • 第五模块的后面紧跟输出层,使用全局平均池化层来将每个通道的高和宽变成1,最后接上一个输出个数为标签类别数的全连接层。

GoogLeNet是一个相对较深较复杂的网络,为了缓解当网络较深时存在的梯度消失现象,GoogLeNet添加了图二中所示的softmax1和softmax2两个辅助分类器(Auxililary Classifier),训练时将三个分类器的损失函数进行加权求和,辅助训练网络浅层模块的参数。辅助分类器的结构信息如下:

  • 步长为3的5x5平均池化;
  • 1x1的128通道卷积;
  • 1024个节点的全连接层 + 概率为0.7的Dropout;
  • 节点数等于输出类别数的全连接输出层。
    图二

由于在深度学习发展过程中发现LRN(Local Response Normalization)实际作用不大,现在主流深度神经网络已经不再使用LRN层了,PaddlePaddle框架中也没有集成LRN层。因此本文说明GoogLeNet时忽略了其中的LRN层,下面的模型复现也没有在代码里实现LRN层。想了解LRN层结构及实现,请参考我的另一篇博客AlexNet。

3. GoogLeNet模型复现

使用飞桨(PaddlePaddle)复现GoogLeNet,首先定义继承自paddle.nn.LayerInception模块,具体代码如下所示:

# -*- coding: utf-8 -*-# @Time    : 2021/8/8 21:58# @Author  : He Ruizhi# @File    : googlenet.py# @Software: PyCharmimport paddleclass Inception(paddle.nn.Layer):    """    定义Inception模块    input_channels:上一层输入特征图通道数    p1_channels:第一条支路1x1卷积的输出通道数,type > int    p2_channels:第二条支路的输出通道数,type > tuple|list,p2_channels[0]:1x1卷积输出通道数,p2_channels[1]:3x3卷积输出通道数    p3_channels:第三条支路的输出通道数,type > tuple|list,p3_channels[0]:1x1卷积输出通道数,p3_channels[1]:5x5卷积输出通道数    p4_channels:第四条支路1x1卷积的输出通道数,type > int    """    def __init__(self, input_channels, p1_channels, p2_channels, p3_channels, p4_channels): super(Inception, self).__init__() # 依次初始化Inception模块各条支路 self.p1 = paddle.nn.Sequential(     paddle.nn.Conv2D(in_channels=input_channels, out_channels=p1_channels, kernel_size=1, stride=1),     paddle.nn.ReLU() ) self.p2 = paddle.nn.Sequential(     paddle.nn.Conv2D(in_channels=input_channels, out_channels=p2_channels[0], kernel_size=1, stride=1),     paddle.nn.ReLU(),     paddle.nn.Conv2D(in_channels=p2_channels[0], out_channels=p2_channels[1], kernel_size=3, padding=1, stride=1),     paddle.nn.ReLU() ) self.p3 = paddle.nn.Sequential(     paddle.nn.Conv2D(in_channels=input_channels, out_channels=p3_channels[0], kernel_size=1, stride=1),     paddle.nn.ReLU(),     paddle.nn.Conv2D(in_channels=p3_channels[0], out_channels=p3_channels[1], kernel_size=5, padding=2, stride=1),     paddle.nn.ReLU() ) self.p4 = paddle.nn.Sequential(     paddle.nn.MaxPool2D(kernel_size=3, stride=1, padding=1),     paddle.nn.Conv2D(in_channels=input_channels, out_channels=p4_channels, kernel_size=1, stride=1),     paddle.nn.ReLU() )    def forward(self, x): # 分别计算各条支路的输出 p1 = self.p1(x) p2 = self.p2(x) p3 = self.p3(x) p4 = self.p4(x) # 将各条支路的输出特征图拼接,作为最终的输出结果,axis=1因为第0维是batch_size return paddle.concat([p1, p2, p3, p4], axis=1)

设置input_channels=192p1_channels=64p2_channels=(96, 128)p3_channels=(16, 32)p4_channels=32,实例化Inception对象,并使用paddle.summary查看Inception结构:

    inception = Inception(192, 64, (96, 128), (16, 32), 32)    paddle.summary(inception, input_size=(None, 192, 224, 224))

打印Inception结构信息如下:

--------------------------------------------------------------------------- Layer (type)Input Shape   Output Shape  Param #    ===========================================================================   Conv2D-1     [[1, 192, 224, 224]]  [1, 64, 224, 224]12,352  ReLU-1      [[1, 64, 224, 224]]   [1, 64, 224, 224]   0   Conv2D-2     [[1, 192, 224, 224]]  [1, 96, 224, 224]18,528  ReLU-2      [[1, 96, 224, 224]]   [1, 96, 224, 224]   0   Conv2D-3     [[1, 96, 224, 224]]   [1, 128, 224, 224]      110,720 ReLU-3      [[1, 128, 224, 224]]  [1, 128, 224, 224]  0   Conv2D-4     [[1, 192, 224, 224]]  [1, 16, 224, 224] 3,088  ReLU-4      [[1, 16, 224, 224]]   [1, 16, 224, 224]   0   Conv2D-5     [[1, 16, 224, 224]]   [1, 32, 224, 224]12,832  ReLU-5      [[1, 32, 224, 224]]   [1, 32, 224, 224]   0  MaxPool2D-1   [[1, 192, 224, 224]]  [1, 192, 224, 224]  0   Conv2D-6     [[1, 192, 224, 224]]  [1, 32, 224, 224] 6,176  ReLU-6      [[1, 32, 224, 224]]   [1, 32, 224, 224]   0===========================================================================Total params: 163,696Trainable params: 163,696Non-trainable params: 0---------------------------------------------------------------------------Input size (MB): 36.75Forward/backward pass size (MB): 355.25Params size (MB): 0.62Estimated Total Size (MB): 392.62---------------------------------------------------------------------------

定义继承自paddle.nn.LayerGoogLeNet类,在__init__方法中定义卷积等模块,在forward函数中实现网络前向计算流程。具体代码如下:

class GoogLeNet(paddle.nn.Layer):    """    搭建GoogLeNet    """    def __init__(self, num_classes=1000): super(GoogLeNet, self).__init__() # 第一个模块:7x7的64通道padding为3步长为2的卷积 + 步长为2的3x3池化 self.conv_block1 = paddle.nn.Sequential(     paddle.nn.Conv2D(in_channels=3, out_channels=64, kernel_size=7, stride=2, padding=3),     paddle.nn.ReLU(),     paddle.nn.MaxPool2D(kernel_size=3, stride=2, padding=1) ) # 第二个模块:1x1的64通道卷积 + 3x3的192通道卷积 + 步长为2的3x3池化 self.conv_block2 = paddle.nn.Sequential(     paddle.nn.Conv2D(in_channels=64, out_channels=64, kernel_size=1, stride=1),     paddle.nn.ReLU(),     paddle.nn.Conv2D(in_channels=64, out_channels=192, kernel_size=3, stride=1, padding=1),     paddle.nn.ReLU(),     paddle.nn.MaxPool2D(kernel_size=3, stride=2, padding=1) ) # 第三个模块:2个Inception模块 + 步长为2的3x3池化 self.inception_block3 = paddle.nn.Sequential(     Inception(192, 64, (96, 128), (16, 32), 32),     Inception(256, 128, (128, 192), (32, 96), 64),     paddle.nn.MaxPool2D(kernel_size=3, stride=2, padding=1) ) # 由于GoogLeNet存在三个输出,因此以下模块不使用paddle.nn.Sequential打包 # 第四个模块:4个Inception模块 + 步长为2的3x3池化 self.inception4a = Inception(480, 192, (96, 208), (16, 48), 64) self.inception4b = Inception(512, 160, (112, 224), (24, 64), 64) self.inception4c = Inception(512, 128, (128, 256), (24, 64), 64) self.inception4d = Inception(512, 112, (144, 288), (32, 64), 64) self.inception4e = Inception(528, 256, (160, 320), (32, 128), 128) self.max_pool4 = paddle.nn.MaxPool2D(kernel_size=3, stride=2, padding=1) # 第五个模块:2个Inception模块 self.inception_block5 = paddle.nn.Sequential(     Inception(832, 256, (160, 320), (32, 128), 128),     Inception(832, 384, (192, 384), (48, 128), 128), ) # 主干输出模块 self.out_main = paddle.nn.Sequential(     paddle.nn.AvgPool2D(kernel_size=7),     paddle.nn.Flatten(),     paddle.nn.Dropout(0.4),     paddle.nn.Linear(in_features=1024, out_features=num_classes) ) # 分支输出1 self.out1 = paddle.nn.Sequential(     paddle.nn.AvgPool2D(kernel_size=5, stride=3),     paddle.nn.Conv2D(in_channels=512, out_channels=128, kernel_size=1),     paddle.nn.Flatten(),     paddle.nn.Linear(in_features=2048, out_features=1024),     paddle.nn.ReLU(),     paddle.nn.Dropout(0.7),     paddle.nn.Linear(in_features=1024, out_features=num_classes) ) # 分支输出2 self.out2 = paddle.nn.Sequential(     paddle.nn.AvgPool2D(kernel_size=5, stride=3),     paddle.nn.Conv2D(in_channels=528, out_channels=128, kernel_size=1),     paddle.nn.Flatten(),     paddle.nn.Linear(in_features=2048, out_features=1024),     paddle.nn.ReLU(),     paddle.nn.Dropout(0.7),     paddle.nn.Linear(in_features=1024, out_features=num_classes) )    def forward(self, x): x = self.conv_block1(x) x = self.conv_block2(x) x = self.inception_block3(x) # 第四个模块须记录Inception4a和Inception4d的输出 ince4a = self.inception4a(x) x = self.inception4b(ince4a) x = self.inception4c(x) ince4d = self.inception4d(x) x = self.inception4e(ince4d) x = self.max_pool4(x) x = self.inception_block5(x) # 主干输出 out = self.out_main(x) # 分支输出1 out1 = self.out1(ince4a) # 分支输出2 out2 = self.out2(ince4d) return out, out1, out2

实例化GoogLeNet模型对象,并使用paddle.summary查看GoogLeNet结构信息:

if __name__ == '__main__':    # inception = Inception(192, 64, (96, 128), (16, 32), 32)    # paddle.summary(inception, input_size=(None, 192, 224, 224))    googlenet = GoogLeNet()    paddle.summary(googlenet, input_size=(None, 3, 224, 224))

打印GoogLeNet模型结构信息如下:

--------------------------------------------------------------------------- Layer (type)Input Shape   Output Shape  Param #    ===========================================================================   Conv2D-1      [[1, 3, 224, 224]]   [1, 64, 112, 112] 9,472  ReLU-1      [[1, 64, 112, 112]]   [1, 64, 112, 112]   0  MaxPool2D-1   [[1, 64, 112, 112]]    [1, 64, 56, 56]    0   Conv2D-2      [[1, 64, 56, 56]]     [1, 64, 56, 56]  4,160  ReLU-2[[1, 64, 56, 56]]     [1, 64, 56, 56]    0   Conv2D-3      [[1, 64, 56, 56]]     [1, 192, 56, 56]110,784 ReLU-3[[1, 192, 56, 56]]    [1, 192, 56, 56]   0  MaxPool2D-2    [[1, 192, 56, 56]]    [1, 192, 28, 28]   0   Conv2D-4      [[1, 192, 28, 28]]    [1, 64, 28, 28] 12,352  ReLU-4[[1, 64, 28, 28]]     [1, 64, 28, 28]    0   Conv2D-5      [[1, 192, 28, 28]]    [1, 96, 28, 28] 18,528  ReLU-5[[1, 96, 28, 28]]     [1, 96, 28, 28]    0   Conv2D-6      [[1, 96, 28, 28]]     [1, 128, 28, 28]110,720 ReLU-6[[1, 128, 28, 28]]    [1, 128, 28, 28]   0   Conv2D-7      [[1, 192, 28, 28]]    [1, 16, 28, 28]  3,088  ReLU-7[[1, 16, 28, 28]]     [1, 16, 28, 28]    0   Conv2D-8      [[1, 16, 28, 28]]     [1, 32, 28, 28] 12,832  ReLU-8[[1, 32, 28, 28]]     [1, 32, 28, 28]    0  MaxPool2D-3    [[1, 192, 28, 28]]    [1, 192, 28, 28]   0   Conv2D-9      [[1, 192, 28, 28]]    [1, 32, 28, 28]  6,176  ReLU-9[[1, 32, 28, 28]]     [1, 32, 28, 28]    0  Inception-1    [[1, 192, 28, 28]]    [1, 256, 28, 28]   0   Conv2D-10     [[1, 256, 28, 28]]    [1, 128, 28, 28]32,896  ReLU-10      [[1, 128, 28, 28]]    [1, 128, 28, 28]   0   Conv2D-11     [[1, 256, 28, 28]]    [1, 128, 28, 28]32,896  ReLU-11      [[1, 128, 28, 28]]    [1, 128, 28, 28]   0   Conv2D-12     [[1, 128, 28, 28]]    [1, 192, 28, 28]221,376 ReLU-12      [[1, 192, 28, 28]]    [1, 192, 28, 28]   0   Conv2D-13     [[1, 256, 28, 28]]    [1, 32, 28, 28]  8,224  ReLU-13      [[1, 32, 28, 28]]     [1, 32, 28, 28]    0   Conv2D-14     [[1, 32, 28, 28]]     [1, 96, 28, 28] 76,896  ReLU-14      [[1, 96, 28, 28]]     [1, 96, 28, 28]    0  MaxPool2D-4    [[1, 256, 28, 28]]    [1, 256, 28, 28]   0   Conv2D-15     [[1, 256, 28, 28]]    [1, 64, 28, 28] 16,448  ReLU-15      [[1, 64, 28, 28]]     [1, 64, 28, 28]    0  Inception-2    [[1, 256, 28, 28]]    [1, 480, 28, 28]   0  MaxPool2D-5    [[1, 480, 28, 28]]    [1, 480, 14, 14]   0   Conv2D-16     [[1, 480, 14, 14]]    [1, 192, 14, 14]92,352  ReLU-16      [[1, 192, 14, 14]]    [1, 192, 14, 14]   0   Conv2D-17     [[1, 480, 14, 14]]    [1, 96, 14, 14] 46,176  ReLU-17      [[1, 96, 14, 14]]     [1, 96, 14, 14]    0   Conv2D-18     [[1, 96, 14, 14]]     [1, 208, 14, 14]179,920 ReLU-18      [[1, 208, 14, 14]]    [1, 208, 14, 14]   0   Conv2D-19     [[1, 480, 14, 14]]    [1, 16, 14, 14]  7,696  ReLU-19      [[1, 16, 14, 14]]     [1, 16, 14, 14]    0   Conv2D-20     [[1, 16, 14, 14]]     [1, 48, 14, 14] 19,248  ReLU-20      [[1, 48, 14, 14]]     [1, 48, 14, 14]    0  MaxPool2D-6    [[1, 480, 14, 14]]    [1, 480, 14, 14]   0   Conv2D-21     [[1, 480, 14, 14]]    [1, 64, 14, 14] 30,784  ReLU-21      [[1, 64, 14, 14]]     [1, 64, 14, 14]    0  Inception-3    [[1, 480, 14, 14]]    [1, 512, 14, 14]   0   Conv2D-22     [[1, 512, 14, 14]]    [1, 160, 14, 14]82,080  ReLU-22      [[1, 160, 14, 14]]    [1, 160, 14, 14]   0   Conv2D-23     [[1, 512, 14, 14]]    [1, 112, 14, 14]57,456  ReLU-23      [[1, 112, 14, 14]]    [1, 112, 14, 14]   0   Conv2D-24     [[1, 112, 14, 14]]    [1, 224, 14, 14]226,016 ReLU-24      [[1, 224, 14, 14]]    [1, 224, 14, 14]   0   Conv2D-25     [[1, 512, 14, 14]]    [1, 24, 14, 14] 12,312  ReLU-25      [[1, 24, 14, 14]]     [1, 24, 14, 14]    0   Conv2D-26     [[1, 24, 14, 14]]     [1, 64, 14, 14] 38,464  ReLU-26      [[1, 64, 14, 14]]     [1, 64, 14, 14]    0  MaxPool2D-7    [[1, 512, 14, 14]]    [1, 512, 14, 14]   0   Conv2D-27     [[1, 512, 14, 14]]    [1, 64, 14, 14] 32,832  ReLU-27      [[1, 64, 14, 14]]     [1, 64, 14, 14]    0  Inception-4    [[1, 512, 14, 14]]    [1, 512, 14, 14]   0   Conv2D-28     [[1, 512, 14, 14]]    [1, 128, 14, 14]65,664  ReLU-28      [[1, 128, 14, 14]]    [1, 128, 14, 14]   0   Conv2D-29     [[1, 512, 14, 14]]    [1, 128, 14, 14]65,664  ReLU-29      [[1, 128, 14, 14]]    [1, 128, 14, 14]   0   Conv2D-30     [[1, 128, 14, 14]]    [1, 256, 14, 14]295,168 ReLU-30      [[1, 256, 14, 14]]    [1, 256, 14, 14]   0   Conv2D-31     [[1, 512, 14, 14]]    [1, 24, 14, 14] 12,312  ReLU-31      [[1, 24, 14, 14]]     [1, 24, 14, 14]    0   Conv2D-32     [[1, 24, 14, 14]]     [1, 64, 14, 14] 38,464  ReLU-32      [[1, 64, 14, 14]]     [1, 64, 14, 14]    0  MaxPool2D-8    [[1, 512, 14, 14]]    [1, 512, 14, 14]   0   Conv2D-33     [[1, 512, 14, 14]]    [1, 64, 14, 14] 32,832  ReLU-33      [[1, 64, 14, 14]]     [1, 64, 14, 14]    0  Inception-5    [[1, 512, 14, 14]]    [1, 512, 14, 14]   0   Conv2D-34     [[1, 512, 14, 14]]    [1, 112, 14, 14]57,456  ReLU-34      [[1, 112, 14, 14]]    [1, 112, 14, 14]   0   Conv2D-35     [[1, 512, 14, 14]]    [1, 144, 14, 14]73,872  ReLU-35      [[1, 144, 14, 14]]    [1, 144, 14, 14]   0   Conv2D-36     [[1, 144, 14, 14]]    [1, 288, 14, 14]373,536 ReLU-36      [[1, 288, 14, 14]]    [1, 288, 14, 14]   0   Conv2D-37     [[1, 512, 14, 14]]    [1, 32, 14, 14] 16,416  ReLU-37      [[1, 32, 14, 14]]     [1, 32, 14, 14]    0   Conv2D-38     [[1, 32, 14, 14]]     [1, 64, 14, 14] 51,264  ReLU-38      [[1, 64, 14, 14]]     [1, 64, 14, 14]    0  MaxPool2D-9    [[1, 512, 14, 14]]    [1, 512, 14, 14]   0   Conv2D-39     [[1, 512, 14, 14]]    [1, 64, 14, 14] 32,832  ReLU-39      [[1, 64, 14, 14]]     [1, 64, 14, 14]    0  Inception-6    [[1, 512, 14, 14]]    [1, 528, 14, 14]   0   Conv2D-40     [[1, 528, 14, 14]]    [1, 256, 14, 14]135,424 ReLU-40      [[1, 256, 14, 14]]    [1, 256, 14, 14]   0   Conv2D-41     [[1, 528, 14, 14]]    [1, 160, 14, 14]84,640  ReLU-41      [[1, 160, 14, 14]]    [1, 160, 14, 14]   0   Conv2D-42     [[1, 160, 14, 14]]    [1, 320, 14, 14]461,120 ReLU-42      [[1, 320, 14, 14]]    [1, 320, 14, 14]   0   Conv2D-43     [[1, 528, 14, 14]]    [1, 32, 14, 14] 16,928  ReLU-43      [[1, 32, 14, 14]]     [1, 32, 14, 14]    0   Conv2D-44     [[1, 32, 14, 14]]     [1, 128, 14, 14]102,528 ReLU-44      [[1, 128, 14, 14]]    [1, 128, 14, 14]   0 MaxPool2D-10    [[1, 528, 14, 14]]    [1, 528, 14, 14]   0   Conv2D-45     [[1, 528, 14, 14]]    [1, 128, 14, 14]67,712  ReLU-45      [[1, 128, 14, 14]]    [1, 128, 14, 14]   0  Inception-7    [[1, 528, 14, 14]]    [1, 832, 14, 14]   0 MaxPool2D-11    [[1, 832, 14, 14]]     [1, 832, 7, 7]    0   Conv2D-46      [[1, 832, 7, 7]]      [1, 256, 7, 7] 213,248 ReLU-46[[1, 256, 7, 7]]      [1, 256, 7, 7]    0   Conv2D-47      [[1, 832, 7, 7]]      [1, 160, 7, 7] 133,280 ReLU-47[[1, 160, 7, 7]]      [1, 160, 7, 7]    0   Conv2D-48      [[1, 160, 7, 7]]      [1, 320, 7, 7] 461,120 ReLU-48[[1, 320, 7, 7]]      [1, 320, 7, 7]    0   Conv2D-49      [[1, 832, 7, 7]]      [1, 32, 7, 7]  26,656  ReLU-49[[1, 32, 7, 7]][1, 32, 7, 7]     0   Conv2D-50      [[1, 32, 7, 7]][1, 128, 7, 7] 102,528 ReLU-50[[1, 128, 7, 7]]      [1, 128, 7, 7]    0 MaxPool2D-12     [[1, 832, 7, 7]]      [1, 832, 7, 7]    0   Conv2D-51      [[1, 832, 7, 7]]      [1, 128, 7, 7] 106,624 ReLU-51[[1, 128, 7, 7]]      [1, 128, 7, 7]    0  Inception-8     [[1, 832, 7, 7]]      [1, 832, 7, 7]    0   Conv2D-52      [[1, 832, 7, 7]]      [1, 384, 7, 7] 319,872 ReLU-52[[1, 384, 7, 7]]      [1, 384, 7, 7]    0   Conv2D-53      [[1, 832, 7, 7]]      [1, 192, 7, 7] 159,936 ReLU-53[[1, 192, 7, 7]]      [1, 192, 7, 7]    0   Conv2D-54      [[1, 192, 7, 7]]      [1, 384, 7, 7] 663,936 ReLU-54[[1, 384, 7, 7]]      [1, 384, 7, 7]    0   Conv2D-55      [[1, 832, 7, 7]]      [1, 48, 7, 7]  39,984  ReLU-55[[1, 48, 7, 7]][1, 48, 7, 7]     0   Conv2D-56      [[1, 48, 7, 7]][1, 128, 7, 7] 153,728 ReLU-56[[1, 128, 7, 7]]      [1, 128, 7, 7]    0 MaxPool2D-13     [[1, 832, 7, 7]]      [1, 832, 7, 7]    0   Conv2D-57      [[1, 832, 7, 7]]      [1, 128, 7, 7] 106,624 ReLU-57[[1, 128, 7, 7]]      [1, 128, 7, 7]    0  Inception-9     [[1, 832, 7, 7]]     [1, 1024, 7, 7]    0  AvgPool2D-1    [[1, 1024, 7, 7]]     [1, 1024, 1, 1]    0   Flatten-1     [[1, 1024, 1, 1]] [1, 1024]0   Dropout-1 [[1, 1024]]    [1, 1024]0   Linear-1  [[1, 1024]]    [1, 1000]   1,025,000     AvgPool2D-2    [[1, 512, 14, 14]]     [1, 512, 4, 4]    0   Conv2D-58      [[1, 512, 4, 4]]      [1, 128, 4, 4] 65,664 Flatten-2      [[1, 128, 4, 4]] [1, 2048]0   Linear-2  [[1, 2048]]    [1, 1024]   2,098,176ReLU-58  [[1, 1024]]    [1, 1024]0   Dropout-2 [[1, 1024]]    [1, 1024]0   Linear-3  [[1, 1024]]    [1, 1000]   1,025,000     AvgPool2D-3    [[1, 528, 14, 14]]     [1, 528, 4, 4]    0   Conv2D-59      [[1, 528, 4, 4]]      [1, 128, 4, 4] 67,712 Flatten-3      [[1, 128, 4, 4]] [1, 2048]0   Linear-4  [[1, 2048]]    [1, 1024]   2,098,176ReLU-59  [[1, 1024]]    [1, 1024]0   Dropout-3 [[1, 1024]]    [1, 1024]0   Linear-5  [[1, 1024]]    [1, 1000]   1,025,000   ===========================================================================Total params: 13,378,280Trainable params: 13,378,280Non-trainable params: 0---------------------------------------------------------------------------Input size (MB): 0.57Forward/backward pass size (MB): 69.75Params size (MB): 51.03Estimated Total Size (MB): 121.36---------------------------------------------------------------------------

4. 参考资料链接

  1. https://aistudio.baidu.com/aistudio/projectdetail/2169490
  2. https://github.com/PaddlePaddle/PaddleClas/blob/release/2.2/ppcls/arch/backbone/model_zoo/googlenet.py
  3. https://www.jianshu.com/p/f1030d6e0eb8
  4. https://www.cnblogs.com/hithongming/p/11197711.html