GoogLeNet是2014年ILSVRC分类任务上的冠军,和AlexNet,VGGNet依靠加深网络结构的深度思想不完全一样,GooLeNet在加深深度的同时,引入了一个叫做Inception的结构来代替之前的卷积加激活的经典组件。
GoogLeNet整体由多个Inception块构建而成,分为5个模块,每个模块之间用步幅为2的3x3最大池化减小输出宽高,每个Inception由四条线路构成。
Inception块中有四条并行的线路:
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
__________________________________________________________________________________________________
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
----------------------------------------------------------------
InceptionV1改进后得到了V2,V3,V4版本。InceptionV2中将大卷积核拆分为小卷积核,将V1中的5×55×5的卷积用两个3×33×3的卷积替代,从而增加网络的深度,减少了参数。
Inception3将n×n卷积分割为1×n和n×1两个卷积,例如,一个的3×3卷积首先执行一个1×3的卷积,然后执行一个3×1的卷积,这种方法的参数量和计算量都比原来降低。
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'
)