1.inception整体结构
1.figure5实现
def inception_1(x,param1,param2,param3,param4):
# branch1 1*1-3*3-3*3
branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(3,3),strides=1)
branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(3,3),strides=1)
# branch2 1*1-3*3
branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,3),strides=1)
# branch3 avg_pool 3*3-1*1
branch3 = keras.layers.AveragePooling2D(pool_size=(3,3),strides=1,padding="same")(x)
branch3 = conv_fn(branch3,filters=param3[0],kernel_size=(1,1),strides=1)
# branch4 1*1
branch4 = conv_fn(x,filters=param4[0],kernel_size=(1,1),strides=1)
return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3,branch4])
2.figure5与figure6中间部分实现
def inception_2(x,param1,param2):
# branch1 conv 3*3
branch1 = conv_fn(x,filters=param1[0],kernel_size=(3,3),strides=2,padding="valid")
# branch2 1*1-3*3-3*3
branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,3),strides=1)
branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,3),strides=2,padding="valid")
# branch3 max_pool 3*3 2
branch3 = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3])
3.figure 6实现
def inception_3(x,param1,param2,param3,param4):
# branch1 1*1-1*7-7*1-1*7-7*1
branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
branch1 = conv_fn(branch1,filters=param1[0],kernel_size=(1,7),strides=1)
branch1 = conv_fn(branch1,filters=param1[0],kernel_size=(7,1),strides=1)
branch1 = conv_fn(branch1,filters=param1[0],kernel_size=(1,7),strides=1)
branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(7,1),strides=1)
# branch2 1*1-1*7-7*1
branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(1,7),strides=1)
branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(7,1),strides=1)
# branch3 avg_pool-conv 1*1
branch3 = keras.layers.AveragePooling2D(pool_size=(3,3),strides=1,padding="same")(x)
branch3 = conv_fn(branch3,param3[0],kernel_size=(1,1),strides=1)
# branch4
branch4 = conv_fn(x,param4[0],kernel_size=(1,1),strides=1)
return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3,branch4])
4.figure6与figure7连接部分实现
def inception_4(x,param1,param2):
# branch1 1*1-3*3
branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(3,3),strides=2,padding='valid')
# branch2 1*1-1*7-7*1-3*3
branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(1,7),strides=1)
branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(7,1),strides=1)
branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(3,3),strides=2,padding='valid')
# branch3 max_pool 3*3
branch3 = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3])
5.辅助输出部分实现
def aux_logit(x,n_classes=1000):
x = keras.layers.AveragePooling2D(pool_size=(5,5),strides=3)(x)
x = conv_fn(x,filters=128,kernel_size=(1,1),strides=1)
x = keras.layers.Flatten()(x)
x = keras.layers.BatchNormalization()(x)
aux_output = keras.layers.Dense(n_classes,activation="softmax")(x)
return aux_output
7.figure7实现
def inception_5(x,param1,param2,param3,param4):
# branch1 1*1
branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
# branch 1*1-1*3 and 3*1
branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
branch2_1 = conv_fn(branch2,filters=param2[1],kernel_size=(1,3),strides=1)
branch2_2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,1),strides=1)
branch2 = keras.layers.Concatenate(axis=3)([branch2_1,branch2_2])
# branch3 1*1-3*3-1*3 and 3*1
branch3 = conv_fn(x,filters=param3[0],kernel_size=(1,1),strides=1)
branch3 = conv_fn(branch3,filters=param3[1],kernel_size=(3,3),strides=1)
branch3_1 = conv_fn(branch3,filters=param3[1],kernel_size=(3,1),strides=1)
branch3_2 = conv_fn(branch3,filters=param3[1],kernel_size=(1,3),strides=1)
branch3 = keras.layers.Concatenate(axis=3)([branch3_1,branch3_2])
# branch avg_pool 3*3 - conv 1*1
branch4 = keras.layers.AveragePooling2D(pool_size=(3,3),strides=1,padding="same")(x)
branch4 = conv_fn(branch3,filters=param4[0],kernel_size=(1,1),strides=1)
return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3,branch4])
8、串联整个网络
def incepetion_v3(input_shape,n_classes=1000):
x_input = keras.layers.Input(shape=input_shape)
x = conv_fn(x_input,filters=32,kernel_size=(3,3),strides=2,padding="valid")
x = conv_fn(x,filters=32,kernel_size=(3,3),strides=1,padding="valid")
x = conv_fn(x,filters=64,kernel_size=(3,3),strides=1)
x = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
x = conv_fn(x,filters=80,kernel_size=(1,1),strides=1,padding="valid")
x = conv_fn(x,filters=192,kernel_size=(3,3),strides=1,padding="valid")
x = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
# mixed 0: 35 x 35 x 256
x = inception_1(x,[64,96],[48,64],[32],[64])
# mixed 1: 35 x 35 x 288
x = inception_1(x,[64,96],[48,64],[64],[64])
# mixed 2: 35 x 35 x 288
x = inception_1(x,[64,96],[48,64],[64],[64])
# mixed 3: 17 x 17 x 768
x = inception_2(x,[384],[64,96])
# mixed 4: 17 x 17 x 768
x = inception_3(x,[128,192],[128,192],[192],[192])
# mixed 5, 6: 17 x 17 x 768
x = inception_3(x,[160,192],[160,192],[192],[192])
x = inception_3(x,[160,192],[160,192],[192],[192])
# mixed 7: 17 x 17 x 768
x = inception_3(x,[192,192],[192,192],[192],[192])
# 辅助输出
aux_out = aux_logit(x,n_classes)
# mixed 8: 8 x 8 x 1280
x = inception_4(x,[192,320],[192])
# mixed 9、10: 8 x 8 x 2048
x = inception_5(x,[320],[384,384],[448,384],[192])
x = inception_5(x,[320],[384,384],[448,384],[192])
# 输出层
x = keras.layers.GlobalAveragePooling2D()(x)
output = keras.layers.Dense(n_classes,activation="relu")(x)
model = keras.models.Model(inputs=[x_input],outputs=[aux_out,output])
return model