![](https://img-blog.csdnimg.cn/5ae832fc4bc8486c8a4767a1da465cfa.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZC05aSp5b635bCR5L6g,size_18,color_FFFFFF,t_70,g_se,x_16)
from tensorflow.keras.layers import (Conv2D,Input,SeparableConv2D,MaxPooling2D,
BatchNormalization,Activation,Add,
GlobalAveragePooling2D,Dense,)
from tensorflow.keras.models import Model
def Xception(input_shape=(299,299,3),num_classes=2):
inputs = Input(shape=input_shape,name='input_layer')
x = Conv2D(32,(3,3),strides=(2,2),padding='same',name='block1_conv1')(inputs)
x = BatchNormalization(name='block1_conv1_bn')(x)
x = Activation('relu',name='block1_conv1_act')(x)
x = Conv2D(64,(3,3),strides=(1,1),padding='same',name='block1_conv2')(x)
x = BatchNormalization(name='block1_conv2_bn')(x)
x = Activation('relu',name='block1_conv2_act')(x)
residual = Conv2D(128,(1,1),(2,2),padding='same')(x)
residual = BatchNormalization()(residual)
x = SeparableConv2D(128,(3,3),padding='same',name='block2_sepconv1')(x)
x = BatchNormalization(name='block2_sepconv1_bn')(x)
x = Activation('relu',name='block2_sepconv1_act')(x)
x = SeparableConv2D(128,(3,3),padding='same',name='block2_sepconv2')(x)
x = BatchNormalization(name='block2_sepconv2_bn')(x)
x = MaxPooling2D((3,3),(2,2),padding='same',name='block2_pool')(x)
x = Add()([x,residual])
residual = Conv2D(256,(1,1),(2,2),padding='same')(x) # 通道增加,feature map size 减小
residual = BatchNormalization()(residual)
x = Activation('relu',name='block3_sepconv1_act')(x)
x = SeparableConv2D(256,(3,3),(1,1),padding='same',name='block3_sepconv1')(x)
x = BatchNormalization(name='block3_sepconv1_bn')(x)
x = Activation('relu',name='block3_sepconv2_act')(x)
x = SeparableConv2D(256,(3,3),(1,1),padding='same',name='block3_sepconv2')(x)
x = BatchNormalization(name='block3_sepconv2_bn')(x)
x = MaxPooling2D((3,3),(2,2),padding='same',name='block3_pool')(x) # 下采样
x = Add()([x,residual])
residual = Conv2D(728,(1,1),(2,2),padding='same')(x)
residual = BatchNormalization()(residual)
x = Activation('relu',name='block4_sepconv1_act')(x)
x = SeparableConv2D(728,(3,3),(1,1),padding='same',name='block4_sepconv1')(x)
x = BatchNormalization(name='block4_sepconv1_bn')(x)
x = Activation('relu',name='block4_sepconv2_act')(x)
x = SeparableConv2D(728,(3,3),(1,1),padding='same',name='block4_sepconv2')(x)
x = BatchNormalization(name='block4_sepconv2_bn')(x)
x = MaxPooling2D((3,3),(2,2),padding='same')(x)
x = Add()([residual,x]) # entry_flow's output
print(x.shape)
residual = x
for i in range(8): # repeted 8 times
prefix = 'block' + str(i + 5)
x = Activation('relu',name=prefix+'_sepconv1_act')(x)
x = SeparableConv2D(728,(3,3),(1,1),padding='same',name=prefix+'_sepconv1')(x)
x = BatchNormalization(name=prefix+'_sepconv1_bn')(x)
x = Activation('relu',name=prefix+'_sepconv2_act')(x)
x = SeparableConv2D(728,(3,3),(1,1),padding='same',name=prefix+'_sepconv2')(x)
x = BatchNormalization(name=prefix+'_sepconv2_bn')(x)
x = Activation('relu',name=prefix+'_sepconv3_act')(x)
x = SeparableConv2D(728,(3,3),(1,1),padding='same',name=prefix+'_sepconv3')(x)
x = BatchNormalization(name=prefix+'_sepconv3_bn')(x)
x = Add()([x,residual])
residual = x
print(x.shape) # middle flow's output
residual = Conv2D(1024,(1,1),(2,2),padding='same')(x)
residual = BatchNormalization()(residual)
x = Activation('relu',name='block13_sepconv1_act')(x)
x = SeparableConv2D(728,(3,3),(1,1),padding='same',name='block13_sepconv1')(x)
x = BatchNormalization()(x)
x = Activation('relu',name='block13_sepconv2_act')(x)
x = SeparableConv2D(1024,(3,3),(1,1),padding='same',name='block13_sepconv2')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((3,3),(2,2),padding='same',name='block13_pool')(x)
x = Add()([x,residual])
x = SeparableConv2D(1536,(3,3),(1,1),padding='same',name='block14_sepconv1')(x)
x = BatchNormalization(name='block14_sepconv1_bn')(x)
x = Activation('relu',name='block14_sepconv1_act')(x)
x = SeparableConv2D(2048,(3,3),(1,1),padding='same',name='block14_sepconv2')(x)
x = BatchNormalization(name='block14_sepconv2_bn')(x)
x = Activation('relu',name='block14_sepconv2_act')(x)
x = GlobalAveragePooling2D(name='avg_pool')(x)
print(x.shape)
x = Dense(num_classes,activation='softmax',name='output_layer')(x)
model = Model(inputs=inputs,outputs=x,name='Xception-tf2')
return model
if __name__ == '__main__':
model = Xception() # 选择默认参数
model.summary()
Model: "Xception-tf2"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_layer (InputLayer) [(None, 299, 299, 3 0 []
)]
block1_conv1 (Conv2D) (None, 150, 150, 32 896 ['input_layer[0][0]']
)
block1_conv1_bn (BatchNormaliz (None, 150, 150, 32 128 ['block1_conv1[0][0]']
ation) )
block1_conv1_act (Activation) (None, 150, 150, 32 0 ['block1_conv1_bn[0][0]']
)
block1_conv2 (Conv2D) (None, 150, 150, 64 18496 ['block1_conv1_act[0][0]']
)
block1_conv2_bn (BatchNormaliz (None, 150, 150, 64 256 ['block1_conv2[0][0]']
ation) )
block1_conv2_act (Activation) (None, 150, 150, 64 0 ['block1_conv2_bn[0][0]']
)
block2_sepconv1 (SeparableConv (None, 150, 150, 12 8896 ['block1_conv2_act[0][0]']
2D) 8)
block2_sepconv1_bn (BatchNorma (None, 150, 150, 12 512 ['block2_sepconv1[0][0]']
lization) 8)
block2_sepconv1_act (Activatio (None, 150, 150, 12 0 ['block2_sepconv1_bn[0][0]']
n) 8)
block2_sepconv2 (SeparableConv (None, 150, 150, 12 17664 ['block2_sepconv1_act[0][0]']
2D) 8)
block2_sepconv2_bn (BatchNorma (None, 150, 150, 12 512 ['block2_sepconv2[0][0]']
lization) 8)
conv2d (Conv2D) (None, 75, 75, 128) 8320 ['block1_conv2_act[0][0]']
block2_pool (MaxPooling2D) (None, 75, 75, 128) 0 ['block2_sepconv2_bn[0][0]']
batch_normalization (BatchNorm (None, 75, 75, 128) 512 ['conv2d[0][0]']
alization)
add (Add) (None, 75, 75, 128) 0 ['block2_pool[0][0]',
'batch_normalization[0][0]']
block3_sepconv1_act (Activatio (None, 75, 75, 128) 0 ['add[0][0]']
n)
block3_sepconv1 (SeparableConv (None, 75, 75, 256) 34176 ['block3_sepconv1_act[0][0]']
2D)
block3_sepconv1_bn (BatchNorma (None, 75, 75, 256) 1024 ['block3_sepconv1[0][0]']
lization)
block3_sepconv2_act (Activatio (None, 75, 75, 256) 0 ['block3_sepconv1_bn[0][0]']
n)
block3_sepconv2 (SeparableConv (None, 75, 75, 256) 68096 ['block3_sepconv2_act[0][0]']
2D)
block3_sepconv2_bn (BatchNorma (None, 75, 75, 256) 1024 ['block3_sepconv2[0][0]']
lization)
conv2d_1 (Conv2D) (None, 38, 38, 256) 33024 ['add[0][0]']
block3_pool (MaxPooling2D) (None, 38, 38, 256) 0 ['block3_sepconv2_bn[0][0]']
batch_normalization_1 (BatchNo (None, 38, 38, 256) 1024 ['conv2d_1[0][0]']
rmalization)
add_1 (Add) (None, 38, 38, 256) 0 ['block3_pool[0][0]',
'batch_normalization_1[0][0]']
block4_sepconv1_act (Activatio (None, 38, 38, 256) 0 ['add_1[0][0]']
n)
block4_sepconv1 (SeparableConv (None, 38, 38, 728) 189400 ['block4_sepconv1_act[0][0]']
2D)
block4_sepconv1_bn (BatchNorma (None, 38, 38, 728) 2912 ['block4_sepconv1[0][0]']
lization)
block4_sepconv2_act (Activatio (None, 38, 38, 728) 0 ['block4_sepconv1_bn[0][0]']
n)
block4_sepconv2 (SeparableConv (None, 38, 38, 728) 537264 ['block4_sepconv2_act[0][0]']
2D)
conv2d_2 (Conv2D) (None, 19, 19, 728) 187096 ['add_1[0][0]']
block4_sepconv2_bn (BatchNorma (None, 38, 38, 728) 2912 ['block4_sepconv2[0][0]']
lization)
batch_normalization_2 (BatchNo (None, 19, 19, 728) 2912 ['conv2d_2[0][0]']
rmalization)
max_pooling2d (MaxPooling2D) (None, 19, 19, 728) 0 ['block4_sepconv2_bn[0][0]']
add_2 (Add) (None, 19, 19, 728) 0 ['batch_normalization_2[0][0]',
'max_pooling2d[0][0]']
block5_sepconv1_act (Activatio (None, 19, 19, 728) 0 ['add_2[0][0]']
n)
block5_sepconv1 (SeparableConv (None, 19, 19, 728) 537264 ['block5_sepconv1_act[0][0]']
2D)
block5_sepconv1_bn (BatchNorma (None, 19, 19, 728) 2912 ['block5_sepconv1[0][0]']
lization)
block5_sepconv2_act (Activatio (None, 19, 19, 728) 0 ['block5_sepconv1_bn[0][0]']
n)
block5_sepconv2 (SeparableConv (None, 19, 19, 728) 537264 ['block5_sepconv2_act[0][0]']
2D)
block5_sepconv2_bn (BatchNorma (None, 19, 19, 728) 2912 ['block5_sepconv2[0][0]']
lization)
block5_sepconv3_act (Activatio (None, 19, 19, 728) 0 ['block5_sepconv2_bn[0][0]']
n)
block5_sepconv3 (SeparableConv (None, 19, 19, 728) 537264 ['block5_sepconv3_act[0][0]']
2D)
block5_sepconv3_bn (BatchNorma (None, 19, 19, 728) 2912 ['block5_sepconv3[0][0]']
lization)
add_3 (Add) (None, 19, 19, 728) 0 ['block5_sepconv3_bn[0][0]',
'add_2[0][0]']
block6_sepconv1_act (Activatio (None, 19, 19, 728) 0 ['add_3[0][0]']
n)
block6_sepconv1 (SeparableConv (None, 19, 19, 728) 537264 ['block6_sepconv1_act[0][0]']
2D)
block6_sepconv1_bn (BatchNorma (None, 19, 19, 728) 2912 ['block6_sepconv1[0][0]']
lization)
block6_sepconv2_act (Activatio (None, 19, 19, 728) 0 ['block6_sepconv1_bn[0][0]']
n)
block6_sepconv2 (SeparableConv (None, 19, 19, 728) 537264 ['block6_sepconv2_act[0][0]']
2D)
block6_sepconv2_bn (BatchNorma (None, 19, 19, 728) 2912 ['block6_sepconv2[0][0]']
lization)
block6_sepconv3_act (Activatio (None, 19, 19, 728) 0 ['block6_sepconv2_bn[0][0]']
n)
block6_sepconv3 (SeparableConv (None, 19, 19, 728) 537264 ['block6_sepconv3_act[0][0]']
2D)
block6_sepconv3_bn (BatchNorma (None, 19, 19, 728) 2912 ['block6_sepconv3[0][0]']
lization)
add_4 (Add) (None, 19, 19, 728) 0 ['block6_sepconv3_bn[0][0]',
'add_3[0][0]']
block7_sepconv1_act (Activatio (None, 19, 19, 728) 0 ['add_4[0][0]']
n)
block7_sepconv1 (SeparableConv (None, 19, 19, 728) 537264 ['block7_sepconv1_act[0][0]']
2D)
block7_sepconv1_bn (BatchNorma (None, 19, 19, 728) 2912 ['block7_sepconv1[0][0]']
lization)
block7_sepconv2_act (Activatio (None, 19, 19, 728) 0 ['block7_sepconv1_bn[0][0]']
n)
block7_sepconv2 (SeparableConv (None, 19, 19, 728) 537264 ['block7_sepconv2_act[0][0]']
2D)
block7_sepconv2_bn (BatchNorma (None, 19, 19, 728) 2912 ['block7_sepconv2[0][0]']
lization)
block7_sepconv3_act (Activatio (None, 19, 19, 728) 0 ['block7_sepconv2_bn[0][0]']
n)
block7_sepconv3 (SeparableConv (None, 19, 19, 728) 537264 ['block7_sepconv3_act[0][0]']
2D)
block7_sepconv3_bn (BatchNorma (None, 19, 19, 728) 2912 ['block7_sepconv3[0][0]']
lization)
add_5 (Add) (None, 19, 19, 728) 0 ['block7_sepconv3_bn[0][0]',
'add_4[0][0]']
block8_sepconv1_act (Activatio (None, 19, 19, 728) 0 ['add_5[0][0]']
n)
block8_sepconv1 (SeparableConv (None, 19, 19, 728) 537264 ['block8_sepconv1_act[0][0]']
2D)
block8_sepconv1_bn (BatchNorma (None, 19, 19, 728) 2912 ['block8_sepconv1[0][0]']
lization)
block8_sepconv2_act (Activatio (None, 19, 19, 728) 0 ['block8_sepconv1_bn[0][0]']
n)
block8_sepconv2 (SeparableConv (None, 19, 19, 728) 537264 ['block8_sepconv2_act[0][0]']
2D)
block8_sepconv2_bn (BatchNorma (None, 19, 19, 728) 2912 ['block8_sepconv2[0][0]']
lization)
block8_sepconv3_act (Activatio (None, 19, 19, 728) 0 ['block8_sepconv2_bn[0][0]']
n)
block8_sepconv3 (SeparableConv (None, 19, 19, 728) 537264 ['block8_sepconv3_act[0][0]']
2D)
block8_sepconv3_bn (BatchNorma (None, 19, 19, 728) 2912 ['block8_sepconv3[0][0]']
lization)
add_6 (Add) (None, 19, 19, 728) 0 ['block8_sepconv3_bn[0][0]',
'add_5[0][0]']
block9_sepconv1_act (Activatio (None, 19, 19, 728) 0 ['add_6[0][0]']
n)
block9_sepconv1 (SeparableConv (None, 19, 19, 728) 537264 ['block9_sepconv1_act[0][0]']
2D)
block9_sepconv1_bn (BatchNorma (None, 19, 19, 728) 2912 ['block9_sepconv1[0][0]']
lization)
block9_sepconv2_act (Activatio (None, 19, 19, 728) 0 ['block9_sepconv1_bn[0][0]']
n)
block9_sepconv2 (SeparableConv (None, 19, 19, 728) 537264 ['block9_sepconv2_act[0][0]']
2D)
block9_sepconv2_bn (BatchNorma (None, 19, 19, 728) 2912 ['block9_sepconv2[0][0]']
lization)
block9_sepconv3_act (Activatio (None, 19, 19, 728) 0 ['block9_sepconv2_bn[0][0]']
n)
block9_sepconv3 (SeparableConv (None, 19, 19, 728) 537264 ['block9_sepconv3_act[0][0]']
2D)
block9_sepconv3_bn (BatchNorma (None, 19, 19, 728) 2912 ['block9_sepconv3[0][0]']
lization)
add_7 (Add) (None, 19, 19, 728) 0 ['block9_sepconv3_bn[0][0]',
'add_6[0][0]']
block10_sepconv1_act (Activati (None, 19, 19, 728) 0 ['add_7[0][0]']
on)
block10_sepconv1 (SeparableCon (None, 19, 19, 728) 537264 ['block10_sepconv1_act[0][0]']
v2D)
block10_sepconv1_bn (BatchNorm (None, 19, 19, 728) 2912 ['block10_sepconv1[0][0]']
alization)
block10_sepconv2_act (Activati (None, 19, 19, 728) 0 ['block10_sepconv1_bn[0][0]']
on)
block10_sepconv2 (SeparableCon (None, 19, 19, 728) 537264 ['block10_sepconv2_act[0][0]']
v2D)
block10_sepconv2_bn (BatchNorm (None, 19, 19, 728) 2912 ['block10_sepconv2[0][0]']
alization)
block10_sepconv3_act (Activati (None, 19, 19, 728) 0 ['block10_sepconv2_bn[0][0]']
on)
block10_sepconv3 (SeparableCon (None, 19, 19, 728) 537264 ['block10_sepconv3_act[0][0]']
v2D)
block10_sepconv3_bn (BatchNorm (None, 19, 19, 728) 2912 ['block10_sepconv3[0][0]']
alization)
add_8 (Add) (None, 19, 19, 728) 0 ['block10_sepconv3_bn[0][0]',
'add_7[0][0]']
block11_sepconv1_act (Activati (None, 19, 19, 728) 0 ['add_8[0][0]']
on)
block11_sepconv1 (SeparableCon (None, 19, 19, 728) 537264 ['block11_sepconv1_act[0][0]']
v2D)
block11_sepconv1_bn (BatchNorm (None, 19, 19, 728) 2912 ['block11_sepconv1[0][0]']
alization)
block11_sepconv2_act (Activati (None, 19, 19, 728) 0 ['block11_sepconv1_bn[0][0]']
on)
block11_sepconv2 (SeparableCon (None, 19, 19, 728) 537264 ['block11_sepconv2_act[0][0]']
v2D)
block11_sepconv2_bn (BatchNorm (None, 19, 19, 728) 2912 ['block11_sepconv2[0][0]']
alization)
block11_sepconv3_act (Activati (None, 19, 19, 728) 0 ['block11_sepconv2_bn[0][0]']
on)
block11_sepconv3 (SeparableCon (None, 19, 19, 728) 537264 ['block11_sepconv3_act[0][0]']
v2D)
block11_sepconv3_bn (BatchNorm (None, 19, 19, 728) 2912 ['block11_sepconv3[0][0]']
alization)
add_9 (Add) (None, 19, 19, 728) 0 ['block11_sepconv3_bn[0][0]',
'add_8[0][0]']
block12_sepconv1_act (Activati (None, 19, 19, 728) 0 ['add_9[0][0]']
on)
block12_sepconv1 (SeparableCon (None, 19, 19, 728) 537264 ['block12_sepconv1_act[0][0]']
v2D)
block12_sepconv1_bn (BatchNorm (None, 19, 19, 728) 2912 ['block12_sepconv1[0][0]']
alization)
block12_sepconv2_act (Activati (None, 19, 19, 728) 0 ['block12_sepconv1_bn[0][0]']
on)
block12_sepconv2 (SeparableCon (None, 19, 19, 728) 537264 ['block12_sepconv2_act[0][0]']
v2D)
block12_sepconv2_bn (BatchNorm (None, 19, 19, 728) 2912 ['block12_sepconv2[0][0]']
alization)
block12_sepconv3_act (Activati (None, 19, 19, 728) 0 ['block12_sepconv2_bn[0][0]']
on)
block12_sepconv3 (SeparableCon (None, 19, 19, 728) 537264 ['block12_sepconv3_act[0][0]']
v2D)
block12_sepconv3_bn (BatchNorm (None, 19, 19, 728) 2912 ['block12_sepconv3[0][0]']
alization)
add_10 (Add) (None, 19, 19, 728) 0 ['block12_sepconv3_bn[0][0]',
'add_9[0][0]']
block13_sepconv1_act (Activati (None, 19, 19, 728) 0 ['add_10[0][0]']
on)
block13_sepconv1 (SeparableCon (None, 19, 19, 728) 537264 ['block13_sepconv1_act[0][0]']
v2D)
batch_normalization_4 (BatchNo (None, 19, 19, 728) 2912 ['block13_sepconv1[0][0]']
rmalization)
block13_sepconv2_act (Activati (None, 19, 19, 728) 0 ['batch_normalization_4[0][0]']
on)
block13_sepconv2 (SeparableCon (None, 19, 19, 1024 753048 ['block13_sepconv2_act[0][0]']
v2D) )
batch_normalization_5 (BatchNo (None, 19, 19, 1024 4096 ['block13_sepconv2[0][0]']
rmalization) )
conv2d_3 (Conv2D) (None, 10, 10, 1024 746496 ['add_10[0][0]']
)
block13_pool (MaxPooling2D) (None, 10, 10, 1024 0 ['batch_normalization_5[0][0]']
)
batch_normalization_3 (BatchNo (None, 10, 10, 1024 4096 ['conv2d_3[0][0]']
rmalization) )
add_11 (Add) (None, 10, 10, 1024 0 ['block13_pool[0][0]',
) 'batch_normalization_3[0][0]']
block14_sepconv1 (SeparableCon (None, 10, 10, 1536 1583616 ['add_11[0][0]']
v2D) )
block14_sepconv1_bn (BatchNorm (None, 10, 10, 1536 6144 ['block14_sepconv1[0][0]']
alization) )
block14_sepconv1_act (Activati (None, 10, 10, 1536 0 ['block14_sepconv1_bn[0][0]']
on) )
block14_sepconv2 (SeparableCon (None, 10, 10, 2048 3161600 ['block14_sepconv1_act[0][0]']
v2D) )
block14_sepconv2_bn (BatchNorm (None, 10, 10, 2048 8192 ['block14_sepconv2[0][0]']
alization) )
block14_sepconv2_act (Activati (None, 10, 10, 2048 0 ['block14_sepconv2_bn[0][0]']
on) )
avg_pool (GlobalAveragePooling (None, 2048) 0 ['block14_sepconv2_act[0][0]']
2D)
output_layer (Dense) (None, 2) 4098 ['avg_pool[0][0]']
==================================================================================================
Total params: 20,892,842
Trainable params: 20,838,314
Non-trainable params: 54,528
__________________________________________________________________________________________________
(py38_tf2) e:\paper\nets\xception\nets>