lecture 8:Inception (v1-v4)
目录
1、Inception基础
1.1 Inception结构
1.2 Inception V1(GoogLeNet)
Naive Inception
Inception Module
GoogLeNet
1.3 Inception V2(Batch Norm)
Inception V2 学习了VGG用两个3´3的卷积代替5´5的大卷积,在降低参数的同时建立了更多的非线性变换,使得 CNN 对特征的学习能力更强:
1.4 Inception V3(Factorization)
1.5 Inception V4(ResNet)
Inception V4 相比 V3 主要是结合了微软的 ResNet,将错误率进一步减少到 3.08%。
这个是V1对应的3个Inception结构,V2添加相应的BN就可以。
- 35降维可以理解为1+9+25
- 17降维理解为每次降7个点,17=>11=>5
- 8降维可以理解为8=>6=>4=>2
1.5 Inception v1~v4 总结
def Conv2d_BN(x, filters, kernel_size, padding='same', strides=(1,1), name=None):
if name is not None:
bn_name = name + '_bn'
conv_name = name + '_conv'
else:
bn_name = None
conv_name = None
x = Conv2D(filters=filters, kernel_size=kernel_size, padding=padding, strides=strides, activation='relu', name=conv_name)(x)
x = BatchNormalization(axis=3, name=bn_name)(x)
return x
def Inception(x, filters):
branch_1x1 = Conv2d_BN(x, filters=filters, kernel_size=(1,1), padding='same', strides=(1,1), name=None)
branch_3x3 = Conv2d_BN(x, filters=filters, kernel_size=(1,1), padding='same', strides=(1,1), name=None)
branch_3x3 = Conv2d_BN(branch_3x3, filters=filters, kernel_size=(3,3), padding='same', strides=(1,1), name=None)
branch_5x5 = Conv2d_BN(x, filters=filters, kernel_size=(1,1), padding='same', strides=(1,1), name=None)
branch_5x5 = Conv2d_BN(branch_5x5, filters=filters, kernel_size=(5,5), padding='same', strides=(1,1), name=None)
branch_pool = MaxPooling2D(pool_size=(3,3), strides=(1,1), padding='same')(x)
branch_pool = Conv2d_BN(branch_pool, filters=filters, kernel_size=(1,1), padding='same', strides=(1,1), name=None)
x = concatenate([branch_1x1, branch_3x3, branch_5x5, branch_pool], axis=3)
return x
def Inception_v2(input_shape=(64,64,3), classes=6):
x_input = Input(input_shape)
"stage 1: "
x = Conv2d_BN(x_input, filters=4, kernel_size=(5,5), strides=(1,1), padding='same')
x = MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='same')(x)
x = Conv2d_BN(x, filters=8, kernel_size=(1,1), strides=(1,1), padding='same')
x = Conv2d_BN(x, filters=8, kernel_size=(3,3), strides=(1,1), padding='same')
x = MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='same')(x)
"stage 2: Inception_v2_block (*2)"
x = Inception(x, 16) #4*16=64
x = Inception(x, 16)
x = MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='same')(x)
"stage 3: Inception_v2_block (*5)"
x = Inception(x, 32)
x = Inception(x, 32)
x = Inception(x, 32)
x = Inception(x, 64)
x = Inception(x, 64)
x = MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='same')(x)
"stage 4: Inception_v2_block (*2)"
x = Inception(x, 128)
x = Inception(x, 128)
x = AveragePooling2D(pool_size=(4,4), strides=(1,1), padding='same')(x)
x = Flatten()(x)
"stage 5: fc"
x = Dropout(0.5)(x)
x = Dense(6,activation='softmax')(x)
model = Model(inputs=x_input, outputs=x, name='Inception_v2')
return model
2、Inception进阶
Inception v4 、Inception ResNet v1、Inception ResNet v2
Inception V4 网络模型 Vs Inception ResNet 模型:
- 果然如winsty所讲,现在论文的公式越来越少了,网络框图开始越来越多了