GoogLeNet模型简介,Tensorflow2与Pytorch的实现

GoogLeNet模型简介

  GoogLeNet是2014年ILSVRC分类任务上的冠军,和AlexNet,VGGNet依靠加深网络结构的深度思想不完全一样,GooLeNet在加深深度的同时,引入了一个叫做Inception的结构来代替之前的卷积加激活的经典组件。

特点

  • 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合。
  • 卷积核大小之所以用1、3、5主要是为了方便对齐。
  • 网络越到后面,特征就会越抽象,所以采用了 1x1 的卷积进行降维。

1.网络结构

  GoogLeNet整体由多个Inception块构建而成,分为5个模块,每个模块之间用步幅为2的3x3最大池化减小输出宽高,每个Inception由四条线路构成。

(1).Inception块结构

​ Inception块中有四条并行的线路:

  • 前三了路线使用窗口大小分别为1x1、3x3和5x5的卷积来提取不同空间尺寸下的信息
  • 中间2个线路会对输入先做1x1卷积来减少输入通道数来降低模型复杂度
  • 第4条线路使用3x3最大池化层,后接1x1卷积来改变通道数
  • 4条线路都是用了合适的填充来使输入与输出的高和宽保持一致
  • 最后将每条线路的输出在通道维上连接,并向后传输

(2).整体网络结构

GoogLeNet模型简介,Tensorflow2与Pytorch的实现_第1张图片

2.TF2实现

from tensorflow.keras.layers import Conv2D,MaxPool2D,Flatten,Dense,Dropout,AveragePooling2D
import tensorflow as tf

# 定义 Inception 块
class Inception(tf.keras.layers.Layer):
    def __init__(self, c1, c2, c3, c4):
        super(Inception,self).__init__()
        self.p1_1 = Conv2D(c1, 1, activation='relu', padding='same')
        self.p2_1 = Conv2D(c2[0], 1, padding='same', activation='relu')
        self.p2_2 = Conv2D(c2[1], 3, padding='same',activation='relu')
        self.p3_1 = Conv2D(c3[0], 1, padding='same', activation='relu')
        self.p3_2 = Conv2D(c3[1], 5, padding='same',activation='relu')
        self.p4_1 = MaxPool2D(pool_size=3, padding='same', strides=1)
        self.p4_2 = Conv2D(c4, 1, padding='same', activation='relu')
    def call(self, x):
        p1 = self.p1_1(x)
        p2 = self.p2_2(self.p2_1(x))
        p3 = self.p3_2(self.p3_1(x))
        p4 = self.p4_2(self.p4_1(x))
        outputs = tf.concat([p1, p2, p3, p4], axis=-1)
        return outputs

# 定义辅助分类器
def Aux_Calssifier(x,filter_num):
    x = AveragePooling2D(5,strides=3,padding='same')(x)
    x = Conv2D(filter_num[0],1,1,padding='valid',activation='relu')(x)
    x = Flatten()(x)
    x = Dense(filter_num[1],activation='relu')(x)
    x = Dense(10,activation='softmax')(x)
    return x

def GoogLeNet():
    # 模型的输入
    inputs = tf.keras.Input(shape=(224,224,3),name='input')
    # Inception1
    x = Conv2D(64,7,strides=2,padding='same',activation='relu')(inputs)	# 224,224,1 -> 112,112,64
    x = MaxPool2D(3,strides=2,padding='same')(x)	# 112,112,64 -> 56,56,64
    # Inception2
    x = Conv2D(64, 1, strides=2,padding='same', activation='relu')(x)
    x = Conv2D(192, 3, padding='same', activation='relu')(x)
    x = MaxPool2D(pool_size=3, strides=2, padding='same')(x)
    # Inception3
    x = Inception(64,(96,128),(16,32),32)(x)
    x = Inception(128,(128,192),(32,96),64)(x)
    x = MaxPool2D(3,strides=2,padding='same')(x)
    # Inception4a
    x = Inception(192,(96,208),(16,48),64)(x)
    # Inception4b4c4d
    aut_output_1 = Aux_Calssifier(x,[128,1024])
    x = Inception(160,(112,224),(24,64),64)(x)
    x = Inception(128,(128,256),(24,64),64)(x)
    x = Inception(112,(144,288),(32,64),64)(x)
    # Inception4e
    aut_output_2 = Aux_Calssifier(x,[128,1024])
	x = Inception(256,(160,320),(32,128),128)(x)
	x = MaxPool2D(3,2,padding='same')(x)
    # Inception5
    x = Inception(256, (160, 320), (32, 128), 128)(x)
	x = Inception(384, (192, 384), (48, 128), 128)(x)
    # 模型输出
    x = tf.keras.layers.GlobalAvgPool2D()(x)
	main_outputs = Dense(10,activation='softmax')(x)
    model = tf.keras.Model(inputs=inputs,outputs=[main_outputs,aut_output_1,aut_output_2])
    
    return model

googLeNet = GoogLeNet()
googLeNet.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input (InputLayer)              [(None, 224, 224, 3) 0                                            
__________________________________________________________________________________________________
conv2d (Conv2D)                 (None, 112, 112, 64) 9472        input[0][0]                      
__________________________________________________________________________________________________
max_pooling2d (MaxPooling2D)    (None, 56, 56, 64)   0           conv2d[0][0]                     
__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 28, 28, 64)   4160        max_pooling2d[0][0]              
__________________________________________________________________________________________________
conv2d_2 (Conv2D)               (None, 28, 28, 192)  110784      conv2d_1[0][0]                   
__________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)  (None, 14, 14, 192)  0           conv2d_2[0][0]                   
__________________________________________________________________________________________________
inception (Inception)           (None, 14, 14, 256)  163696      max_pooling2d_1[0][0]            
__________________________________________________________________________________________________
inception_1 (Inception)         (None, 14, 14, 480)  388736      inception[0][0]                  
__________________________________________________________________________________________________
max_pooling2d_4 (MaxPooling2D)  (None, 7, 7, 480)    0           inception_1[0][0]                
__________________________________________________________________________________________________
inception_2 (Inception)         (None, 7, 7, 512)    376176      max_pooling2d_4[0][0]            
__________________________________________________________________________________________________
inception_3 (Inception)         (None, 7, 7, 512)    449160      inception_2[0][0]                
__________________________________________________________________________________________________
inception_4 (Inception)         (None, 7, 7, 512)    510104      inception_3[0][0]                
__________________________________________________________________________________________________
inception_5 (Inception)         (None, 7, 7, 528)    605376      inception_4[0][0]                
__________________________________________________________________________________________________
inception_6 (Inception)         (None, 7, 7, 832)    868352      inception_5[0][0]                
__________________________________________________________________________________________________
max_pooling2d_10 (MaxPooling2D) (None, 4, 4, 832)    0           inception_6[0][0]                
__________________________________________________________________________________________________
average_pooling2d (AveragePooli (None, 3, 3, 512)    0           inception_2[0][0]                
__________________________________________________________________________________________________
average_pooling2d_1 (AveragePoo (None, 3, 3, 528)    0           inception_5[0][0]                
__________________________________________________________________________________________________
inception_7 (Inception)         (None, 4, 4, 832)    1043456     max_pooling2d_10[0][0]           
__________________________________________________________________________________________________
conv2d_21 (Conv2D)              (None, 3, 3, 128)    65664       average_pooling2d[0][0]          
__________________________________________________________________________________________________
conv2d_40 (Conv2D)              (None, 3, 3, 128)    67712       average_pooling2d_1[0][0]        
__________________________________________________________________________________________________
inception_8 (Inception)         (None, 4, 4, 1024)   1444080     inception_7[0][0]                
__________________________________________________________________________________________________
flatten (Flatten)               (None, 1152)         0           conv2d_21[0][0]                  
__________________________________________________________________________________________________
flatten_1 (Flatten)             (None, 1152)         0           conv2d_40[0][0]                  
__________________________________________________________________________________________________
global_average_pooling2d (Globa (None, 1024)         0           inception_8[0][0]                
__________________________________________________________________________________________________
dense (Dense)                   (None, 1024)         1180672     flatten[0][0]                    
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 1024)         1180672     flatten_1[0][0]                  
__________________________________________________________________________________________________
dense_4 (Dense)                 (None, 10)           10250       global_average_pooling2d[0][0]   
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 10)           10250       dense[0][0]                      
__________________________________________________________________________________________________
dense_3 (Dense)                 (None, 10)           10250       dense_2[0][0]                    
==================================================================================================
Total params: 8,499,022
Trainable params: 8,499,022
Non-trainable params: 0
__________________________________________________________________________________________________

3.PyTorch实现

PyTorch 中的 GoogLeNet 中每个卷积层后面都添加了BN层。

import torchvision.models as models
from torchsummary import summary

GoogLeNet = models.googlenet()
print(GoogLeNet)
summary(GoogLeNet.cuda(),(3,224,224))
GoogLeNet(
  (conv1): BasicConv2d(
    (conv): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
    (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (maxpool1): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)
  (conv2): BasicConv2d(
    (conv): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (conv3): BasicConv2d(
    (conv): Conv2d(64, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
    (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (maxpool2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)
  (inception3a): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(96, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(192, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(16, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (inception3b): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(128, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(32, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (maxpool3): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=True)
  (inception4a): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(480, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(480, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(96, 208, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(208, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(480, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(16, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(16, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(480, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (inception4b): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(512, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(112, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(112, 224, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(224, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(24, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(24, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (inception4c): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(24, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(24, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (inception4d): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(112, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(512, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(144, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(144, 288, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(288, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (inception4e): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(528, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(528, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(528, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(32, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(528, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (maxpool4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True)
  (inception5a): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(832, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(256, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(832, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(832, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(32, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (inception5b): Inception(
    (branch1): BasicConv2d(
      (conv): Conv2d(832, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch2): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(832, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch3): Sequential(
      (0): BasicConv2d(
        (conv): Conv2d(832, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
      (1): BasicConv2d(
        (conv): Conv2d(48, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (branch4): Sequential(
      (0): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=True)
      (1): BasicConv2d(
        (conv): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
  )
  (aux1): InceptionAux(
    (conv): BasicConv2d(
      (conv): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (fc1): Linear(in_features=2048, out_features=1024, bias=True)
    (fc2): Linear(in_features=1024, out_features=1000, bias=True)
  )
  (aux2): InceptionAux(
    (conv): BasicConv2d(
      (conv): Conv2d(528, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (fc1): Linear(in_features=2048, out_features=1024, bias=True)
    (fc2): Linear(in_features=1024, out_features=1000, bias=True)
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
  (dropout): Dropout(p=0.2, inplace=False)
  (fc): Linear(in_features=1024, out_features=1000, bias=True)
)
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 112, 112]           9,408
       BatchNorm2d-2         [-1, 64, 112, 112]             128
       BasicConv2d-3         [-1, 64, 112, 112]               0
         MaxPool2d-4           [-1, 64, 56, 56]               0
            Conv2d-5           [-1, 64, 56, 56]           4,096
       BatchNorm2d-6           [-1, 64, 56, 56]             128
       BasicConv2d-7           [-1, 64, 56, 56]               0
            Conv2d-8          [-1, 192, 56, 56]         110,592
       BatchNorm2d-9          [-1, 192, 56, 56]             384
      BasicConv2d-10          [-1, 192, 56, 56]               0
        MaxPool2d-11          [-1, 192, 28, 28]               0
           Conv2d-12           [-1, 64, 28, 28]          12,288
      BatchNorm2d-13           [-1, 64, 28, 28]             128
      BasicConv2d-14           [-1, 64, 28, 28]               0
           Conv2d-15           [-1, 96, 28, 28]          18,432
      BatchNorm2d-16           [-1, 96, 28, 28]             192
      BasicConv2d-17           [-1, 96, 28, 28]               0
           Conv2d-18          [-1, 128, 28, 28]         110,592
      BatchNorm2d-19          [-1, 128, 28, 28]             256
      BasicConv2d-20          [-1, 128, 28, 28]               0
           Conv2d-21           [-1, 16, 28, 28]           3,072
      BatchNorm2d-22           [-1, 16, 28, 28]              32
      BasicConv2d-23           [-1, 16, 28, 28]               0
           Conv2d-24           [-1, 32, 28, 28]           4,608
      BatchNorm2d-25           [-1, 32, 28, 28]              64
      BasicConv2d-26           [-1, 32, 28, 28]               0
        MaxPool2d-27          [-1, 192, 28, 28]               0
           Conv2d-28           [-1, 32, 28, 28]           6,144
      BatchNorm2d-29           [-1, 32, 28, 28]              64
      BasicConv2d-30           [-1, 32, 28, 28]               0
        Inception-31          [-1, 256, 28, 28]               0
           Conv2d-32          [-1, 128, 28, 28]          32,768
      BatchNorm2d-33          [-1, 128, 28, 28]             256
      BasicConv2d-34          [-1, 128, 28, 28]               0
           Conv2d-35          [-1, 128, 28, 28]          32,768
      BatchNorm2d-36          [-1, 128, 28, 28]             256
      BasicConv2d-37          [-1, 128, 28, 28]               0
           Conv2d-38          [-1, 192, 28, 28]         221,184
      BatchNorm2d-39          [-1, 192, 28, 28]             384
      BasicConv2d-40          [-1, 192, 28, 28]               0
           Conv2d-41           [-1, 32, 28, 28]           8,192
      BatchNorm2d-42           [-1, 32, 28, 28]              64
      BasicConv2d-43           [-1, 32, 28, 28]               0
           Conv2d-44           [-1, 96, 28, 28]          27,648
      BatchNorm2d-45           [-1, 96, 28, 28]             192
      BasicConv2d-46           [-1, 96, 28, 28]               0
        MaxPool2d-47          [-1, 256, 28, 28]               0
           Conv2d-48           [-1, 64, 28, 28]          16,384
      BatchNorm2d-49           [-1, 64, 28, 28]             128
      BasicConv2d-50           [-1, 64, 28, 28]               0
        Inception-51          [-1, 480, 28, 28]               0
        MaxPool2d-52          [-1, 480, 14, 14]               0
           Conv2d-53          [-1, 192, 14, 14]          92,160
      BatchNorm2d-54          [-1, 192, 14, 14]             384
      BasicConv2d-55          [-1, 192, 14, 14]               0
           Conv2d-56           [-1, 96, 14, 14]          46,080
      BatchNorm2d-57           [-1, 96, 14, 14]             192
      BasicConv2d-58           [-1, 96, 14, 14]               0
           Conv2d-59          [-1, 208, 14, 14]         179,712
      BatchNorm2d-60          [-1, 208, 14, 14]             416
      BasicConv2d-61          [-1, 208, 14, 14]               0
           Conv2d-62           [-1, 16, 14, 14]           7,680
      BatchNorm2d-63           [-1, 16, 14, 14]              32
      BasicConv2d-64           [-1, 16, 14, 14]               0
           Conv2d-65           [-1, 48, 14, 14]           6,912
      BatchNorm2d-66           [-1, 48, 14, 14]              96
      BasicConv2d-67           [-1, 48, 14, 14]               0
        MaxPool2d-68          [-1, 480, 14, 14]               0
           Conv2d-69           [-1, 64, 14, 14]          30,720
      BatchNorm2d-70           [-1, 64, 14, 14]             128
      BasicConv2d-71           [-1, 64, 14, 14]               0
        Inception-72          [-1, 512, 14, 14]               0
           Conv2d-73            [-1, 128, 4, 4]          65,536
      BatchNorm2d-74            [-1, 128, 4, 4]             256
      BasicConv2d-75            [-1, 128, 4, 4]               0
           Linear-76                 [-1, 1024]       2,098,176
           Linear-77                 [-1, 1000]       1,025,000
     InceptionAux-78                 [-1, 1000]               0
           Conv2d-79          [-1, 160, 14, 14]          81,920
      BatchNorm2d-80          [-1, 160, 14, 14]             320
      BasicConv2d-81          [-1, 160, 14, 14]               0
           Conv2d-82          [-1, 112, 14, 14]          57,344
      BatchNorm2d-83          [-1, 112, 14, 14]             224
      BasicConv2d-84          [-1, 112, 14, 14]               0
           Conv2d-85          [-1, 224, 14, 14]         225,792
      BatchNorm2d-86          [-1, 224, 14, 14]             448
      BasicConv2d-87          [-1, 224, 14, 14]               0
           Conv2d-88           [-1, 24, 14, 14]          12,288
      BatchNorm2d-89           [-1, 24, 14, 14]              48
      BasicConv2d-90           [-1, 24, 14, 14]               0
           Conv2d-91           [-1, 64, 14, 14]          13,824
      BatchNorm2d-92           [-1, 64, 14, 14]             128
      BasicConv2d-93           [-1, 64, 14, 14]               0
        MaxPool2d-94          [-1, 512, 14, 14]               0
           Conv2d-95           [-1, 64, 14, 14]          32,768
      BatchNorm2d-96           [-1, 64, 14, 14]             128
      BasicConv2d-97           [-1, 64, 14, 14]               0
        Inception-98          [-1, 512, 14, 14]               0
           Conv2d-99          [-1, 128, 14, 14]          65,536
     BatchNorm2d-100          [-1, 128, 14, 14]             256
     BasicConv2d-101          [-1, 128, 14, 14]               0
          Conv2d-102          [-1, 128, 14, 14]          65,536
     BatchNorm2d-103          [-1, 128, 14, 14]             256
     BasicConv2d-104          [-1, 128, 14, 14]               0
          Conv2d-105          [-1, 256, 14, 14]         294,912
     BatchNorm2d-106          [-1, 256, 14, 14]             512
     BasicConv2d-107          [-1, 256, 14, 14]               0
          Conv2d-108           [-1, 24, 14, 14]          12,288
     BatchNorm2d-109           [-1, 24, 14, 14]              48
     BasicConv2d-110           [-1, 24, 14, 14]               0
          Conv2d-111           [-1, 64, 14, 14]          13,824
     BatchNorm2d-112           [-1, 64, 14, 14]             128
     BasicConv2d-113           [-1, 64, 14, 14]               0
       MaxPool2d-114          [-1, 512, 14, 14]               0
          Conv2d-115           [-1, 64, 14, 14]          32,768
     BatchNorm2d-116           [-1, 64, 14, 14]             128
     BasicConv2d-117           [-1, 64, 14, 14]               0
       Inception-118          [-1, 512, 14, 14]               0
          Conv2d-119          [-1, 112, 14, 14]          57,344
     BatchNorm2d-120          [-1, 112, 14, 14]             224
     BasicConv2d-121          [-1, 112, 14, 14]               0
          Conv2d-122          [-1, 144, 14, 14]          73,728
     BatchNorm2d-123          [-1, 144, 14, 14]             288
     BasicConv2d-124          [-1, 144, 14, 14]               0
          Conv2d-125          [-1, 288, 14, 14]         373,248
     BatchNorm2d-126          [-1, 288, 14, 14]             576
     BasicConv2d-127          [-1, 288, 14, 14]               0
          Conv2d-128           [-1, 32, 14, 14]          16,384
     BatchNorm2d-129           [-1, 32, 14, 14]              64
     BasicConv2d-130           [-1, 32, 14, 14]               0
          Conv2d-131           [-1, 64, 14, 14]          18,432
     BatchNorm2d-132           [-1, 64, 14, 14]             128
     BasicConv2d-133           [-1, 64, 14, 14]               0
       MaxPool2d-134          [-1, 512, 14, 14]               0
          Conv2d-135           [-1, 64, 14, 14]          32,768
     BatchNorm2d-136           [-1, 64, 14, 14]             128
     BasicConv2d-137           [-1, 64, 14, 14]               0
       Inception-138          [-1, 528, 14, 14]               0
          Conv2d-139            [-1, 128, 4, 4]          67,584
     BatchNorm2d-140            [-1, 128, 4, 4]             256
     BasicConv2d-141            [-1, 128, 4, 4]               0
          Linear-142                 [-1, 1024]       2,098,176
          Linear-143                 [-1, 1000]       1,025,000
    InceptionAux-144                 [-1, 1000]               0
          Conv2d-145          [-1, 256, 14, 14]         135,168
     BatchNorm2d-146          [-1, 256, 14, 14]             512
     BasicConv2d-147          [-1, 256, 14, 14]               0
          Conv2d-148          [-1, 160, 14, 14]          84,480
     BatchNorm2d-149          [-1, 160, 14, 14]             320
     BasicConv2d-150          [-1, 160, 14, 14]               0
          Conv2d-151          [-1, 320, 14, 14]         460,800
     BatchNorm2d-152          [-1, 320, 14, 14]             640
     BasicConv2d-153          [-1, 320, 14, 14]               0
          Conv2d-154           [-1, 32, 14, 14]          16,896
     BatchNorm2d-155           [-1, 32, 14, 14]              64
     BasicConv2d-156           [-1, 32, 14, 14]               0
          Conv2d-157          [-1, 128, 14, 14]          36,864
     BatchNorm2d-158          [-1, 128, 14, 14]             256
     BasicConv2d-159          [-1, 128, 14, 14]               0
       MaxPool2d-160          [-1, 528, 14, 14]               0
          Conv2d-161          [-1, 128, 14, 14]          67,584
     BatchNorm2d-162          [-1, 128, 14, 14]             256
     BasicConv2d-163          [-1, 128, 14, 14]               0
       Inception-164          [-1, 832, 14, 14]               0
       MaxPool2d-165            [-1, 832, 7, 7]               0
          Conv2d-166            [-1, 256, 7, 7]         212,992
     BatchNorm2d-167            [-1, 256, 7, 7]             512
     BasicConv2d-168            [-1, 256, 7, 7]               0
          Conv2d-169            [-1, 160, 7, 7]         133,120
     BatchNorm2d-170            [-1, 160, 7, 7]             320
     BasicConv2d-171            [-1, 160, 7, 7]               0
          Conv2d-172            [-1, 320, 7, 7]         460,800
     BatchNorm2d-173            [-1, 320, 7, 7]             640
     BasicConv2d-174            [-1, 320, 7, 7]               0
          Conv2d-175             [-1, 32, 7, 7]          26,624
     BatchNorm2d-176             [-1, 32, 7, 7]              64
     BasicConv2d-177             [-1, 32, 7, 7]               0
          Conv2d-178            [-1, 128, 7, 7]          36,864
     BatchNorm2d-179            [-1, 128, 7, 7]             256
     BasicConv2d-180            [-1, 128, 7, 7]               0
       MaxPool2d-181            [-1, 832, 7, 7]               0
          Conv2d-182            [-1, 128, 7, 7]         106,496
     BatchNorm2d-183            [-1, 128, 7, 7]             256
     BasicConv2d-184            [-1, 128, 7, 7]               0
       Inception-185            [-1, 832, 7, 7]               0
          Conv2d-186            [-1, 384, 7, 7]         319,488
     BatchNorm2d-187            [-1, 384, 7, 7]             768
     BasicConv2d-188            [-1, 384, 7, 7]               0
          Conv2d-189            [-1, 192, 7, 7]         159,744
     BatchNorm2d-190            [-1, 192, 7, 7]             384
     BasicConv2d-191            [-1, 192, 7, 7]               0
          Conv2d-192            [-1, 384, 7, 7]         663,552
     BatchNorm2d-193            [-1, 384, 7, 7]             768
     BasicConv2d-194            [-1, 384, 7, 7]               0
          Conv2d-195             [-1, 48, 7, 7]          39,936
     BatchNorm2d-196             [-1, 48, 7, 7]              96
     BasicConv2d-197             [-1, 48, 7, 7]               0
          Conv2d-198            [-1, 128, 7, 7]          55,296
     BatchNorm2d-199            [-1, 128, 7, 7]             256
     BasicConv2d-200            [-1, 128, 7, 7]               0
       MaxPool2d-201            [-1, 832, 7, 7]               0
          Conv2d-202            [-1, 128, 7, 7]         106,496
     BatchNorm2d-203            [-1, 128, 7, 7]             256
     BasicConv2d-204            [-1, 128, 7, 7]               0
       Inception-205           [-1, 1024, 7, 7]               0
AdaptiveAvgPool2d-206           [-1, 1024, 1, 1]               0
         Dropout-207                 [-1, 1024]               0
          Linear-208                 [-1, 1000]       1,025,000
================================================================
Total params: 13,004,888
Trainable params: 13,004,888
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 94.25
Params size (MB): 49.61
Estimated Total Size (MB): 144.43
----------------------------------------------------------------

4.Inception延伸版本

  InceptionV1改进后得到了V2,V3,V4版本。InceptionV2中将大卷积核拆分为小卷积核,将V1中的5×55×5的卷积用两个3×33×3的卷积替代,从而增加网络的深度,减少了参数。

GoogLeNet模型简介,Tensorflow2与Pytorch的实现_第2张图片

  Inception3将n×n卷积分割为1×n和n×1两个卷积,例如,一个的3×3卷积首先执行一个1×3的卷积,然后执行一个3×1的卷积,这种方法的参数量和计算量都比原来降低。

GoogLeNet模型简介,Tensorflow2与Pytorch的实现_第3张图片

tf2 实现 InceptionV3

InceptionV3 = tf.keras.applications.inception_v3.InceptionV3(
    include_top=True,
    weights='imagenet',
    input_tensor=None,
    input_shape=None,
    pooling=None,
    classes=1000,
    classifier_activation='softmax'
)

你可能感兴趣的:(经典卷积神经网络,tensorflow,pytorch,深度学习)