import warnings
warnings.filterwarnings("ignore")
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorboard
from tensorflow.keras.layers import (Conv2D,MaxPool2D,Input,ZeroPadding2D,
Add,AveragePooling2D,Dense,)
from tensorflow.keras.models import Model
def conv_block(inputs,block_id:str,filter_num,stride=1):
""" 从conv3_x开始,第1个1*1卷积需要下采样 """
if (block_id[0]!='1' and block_id[2]=='1'):
stride = 2
bottle_conv1 = Conv2D(filter_num,1,stride,activation='relu',name="block"+block_id+"_conv1")(inputs)
bottle_conv2 = Conv2D(filter_num,3,1,activation='relu',name="block"+block_id+"_conv2")(bottle_conv1)
bottle_conv3 = Conv2D(filter_num*4,1,1,activation='relu',name="block"+block_id+"_conv3")(bottle_conv2)
bottle_conv3_pad = ZeroPadding2D((1,1),name="block"+block_id+"_conv3Pad")(bottle_conv3)
""" 从conv2_x开始,第1个1*1卷积需要下采样与输出进行堆叠 """
inputs_conv = Conv2D(filter_num*4,1,stride,activation='relu',name='block'+block_id+"_conv4")(inputs)
# print(block_id,bottle_conv3.shape,inputs_conv.shape)
bottle_out = Add()([bottle_conv3_pad,inputs_conv])
return bottle_out
def RESNET50(input_shape=(224,224,3),num_classes=1000):
inputs = Input(shape=input_shape)
inputsPad = ZeroPadding2D((3,3))(inputs) # 多出
conv1 = Conv2D(64,7,2,activation='relu',name='conv1')(inputsPad)
conv2_x_1 = MaxPool2D((3,3),2,padding='same',name='conv2_x_maxpooling')(conv1) # 注意padding
print('conv2_x start...')
filter_nums0 = 64
BLOCK1_out = conv2_x_1
for i in range(1,4):
BLOCK1_out = conv_block(BLOCK1_out,f"1_{i}",filter_nums0)
print('conv2_x done!')
print(BLOCK1_out.shape)
print('conv3_x start...')
filter_nums1 = 128
# remind downsampling
BLOCK2_out = BLOCK1_out
for i in range(1,5):
BLOCK2_out = conv_block(BLOCK2_out,f"2_{i}",filter_nums1)
print('conv3_x done!')
print(BLOCK2_out.shape)
print('conv4_x start...')
filter_num2 = 256
# remind downsampling
BLOCK3_out = BLOCK2_out
for i in range(1,7):
BLOCK3_out = conv_block(BLOCK3_out,f"3_{i}",filter_num2)
print('conv4_x done!')
print(BLOCK3_out.shape)
print('conv5_x start...')
filter_num3 = 512
# remind downsampling
BLOCK4_out = BLOCK3_out
for i in range(1,4):
BLOCK4_out = conv_block(BLOCK4_out,f"4_{i}",filter_num3)
print('conv5_x done!')
print(BLOCK4_out.shape)
avgPooling = AveragePooling2D(BLOCK4_out.shape[1],name='average_pool')(BLOCK4_out)
outlayer = Dense(num_classes,activation='softmax',name='out_layer')(avgPooling)
# print(outlayer.shape)
model = Model(inputs=inputs,outputs=outlayer,name='resnet50-tf2')
# model.load_weights("resnet50_weights_tf_dim_ordering_tf_kernels.h5")
return model
model = RESNET50(num_classes=2)
model.summary()
print(f"layer's length={len(model.layers)}")
for i,layer in enumerate(model.layers):
print(i,layer.name)
今天看了一下resnet论文,复现了一下resnet50,看网上分成了itentity_block和conv_block,其实就是conv3_x开始有一个通过卷积实现的下采样,需要设置stride=2,其他我感觉都一样啊。
conv4_x和conv5_x类似,可以看下代码
输出:
(py38_tf2) E:\paper\nets\resnet>python -u "e:\paper\nets\resnet\resnet50.py"
conv2_x start...
conv2_x done!
(None, 56, 56, 256)
conv3_x start...
conv3_x done!
(None, 28, 28, 512)
conv4_x start...
conv4_x done!
(None, 14, 14, 1024)
conv5_x start...
conv5_x done!
(None, 7, 7, 2048)
Model: "resnet50-tf2"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 224, 224, 3 0 []
)]
zero_padding2d (ZeroPadding2D) (None, 230, 230, 3) 0 ['input_1[0][0]']
conv1 (Conv2D) (None, 112, 112, 64 9472 ['zero_padding2d[0][0]']
)
conv2_x_maxpooling (MaxPooling (None, 56, 56, 64) 0 ['conv1[0][0]']
2D)
block1_1_conv1 (Conv2D) (None, 56, 56, 64) 4160 ['conv2_x_maxpooling[0][0]']
block1_1_conv2 (Conv2D) (None, 54, 54, 64) 36928 ['block1_1_conv1[0][0]']
block1_1_conv3 (Conv2D) (None, 54, 54, 256) 16640 ['block1_1_conv2[0][0]']
block1_1_conv3Pad (ZeroPadding (None, 56, 56, 256) 0 ['block1_1_conv3[0][0]']
2D)
block1_1_conv4 (Conv2D) (None, 56, 56, 256) 16640 ['conv2_x_maxpooling[0][0]']
add (Add) (None, 56, 56, 256) 0 ['block1_1_conv3Pad[0][0]',
'block1_1_conv4[0][0]']
block1_2_conv1 (Conv2D) (None, 56, 56, 64) 16448 ['add[0][0]']
block1_2_conv2 (Conv2D) (None, 54, 54, 64) 36928 ['block1_2_conv1[0][0]']
block1_2_conv3 (Conv2D) (None, 54, 54, 256) 16640 ['block1_2_conv2[0][0]']
block1_2_conv3Pad (ZeroPadding (None, 56, 56, 256) 0 ['block1_2_conv3[0][0]']
2D)
block1_2_conv4 (Conv2D) (None, 56, 56, 256) 65792 ['add[0][0]']
add_1 (Add) (None, 56, 56, 256) 0 ['block1_2_conv3Pad[0][0]',
'block1_2_conv4[0][0]']
block1_3_conv1 (Conv2D) (None, 56, 56, 64) 16448 ['add_1[0][0]']
block1_3_conv2 (Conv2D) (None, 54, 54, 64) 36928 ['block1_3_conv1[0][0]']
block1_3_conv3 (Conv2D) (None, 54, 54, 256) 16640 ['block1_3_conv2[0][0]']
block1_3_conv3Pad (ZeroPadding (None, 56, 56, 256) 0 ['block1_3_conv3[0][0]']
2D)
block1_3_conv4 (Conv2D) (None, 56, 56, 256) 65792 ['add_1[0][0]']
add_2 (Add) (None, 56, 56, 256) 0 ['block1_3_conv3Pad[0][0]',
'block1_3_conv4[0][0]']
block2_1_conv1 (Conv2D) (None, 28, 28, 128) 32896 ['add_2[0][0]']
block2_1_conv2 (Conv2D) (None, 26, 26, 128) 147584 ['block2_1_conv1[0][0]']
block2_1_conv3 (Conv2D) (None, 26, 26, 512) 66048 ['block2_1_conv2[0][0]']
block2_1_conv3Pad (ZeroPadding (None, 28, 28, 512) 0 ['block2_1_conv3[0][0]']
2D)
block2_1_conv4 (Conv2D) (None, 28, 28, 512) 131584 ['add_2[0][0]']
add_3 (Add) (None, 28, 28, 512) 0 ['block2_1_conv3Pad[0][0]',
'block2_1_conv4[0][0]']
block2_2_conv1 (Conv2D) (None, 28, 28, 128) 65664 ['add_3[0][0]']
block2_2_conv2 (Conv2D) (None, 26, 26, 128) 147584 ['block2_2_conv1[0][0]']
block2_2_conv3 (Conv2D) (None, 26, 26, 512) 66048 ['block2_2_conv2[0][0]']
block2_2_conv3Pad (ZeroPadding (None, 28, 28, 512) 0 ['block2_2_conv3[0][0]']
2D)
block2_2_conv4 (Conv2D) (None, 28, 28, 512) 262656 ['add_3[0][0]']
add_4 (Add) (None, 28, 28, 512) 0 ['block2_2_conv3Pad[0][0]',
'block2_2_conv4[0][0]']
block2_3_conv1 (Conv2D) (None, 28, 28, 128) 65664 ['add_4[0][0]']
block2_3_conv2 (Conv2D) (None, 26, 26, 128) 147584 ['block2_3_conv1[0][0]']
block2_3_conv3 (Conv2D) (None, 26, 26, 512) 66048 ['block2_3_conv2[0][0]']
block2_3_conv3Pad (ZeroPadding (None, 28, 28, 512) 0 ['block2_3_conv3[0][0]']
2D)
block2_3_conv4 (Conv2D) (None, 28, 28, 512) 262656 ['add_4[0][0]']
add_5 (Add) (None, 28, 28, 512) 0 ['block2_3_conv3Pad[0][0]',
'block2_3_conv4[0][0]']
block2_4_conv1 (Conv2D) (None, 28, 28, 128) 65664 ['add_5[0][0]']
block2_4_conv2 (Conv2D) (None, 26, 26, 128) 147584 ['block2_4_conv1[0][0]']
block2_4_conv3 (Conv2D) (None, 26, 26, 512) 66048 ['block2_4_conv2[0][0]']
block2_4_conv3Pad (ZeroPadding (None, 28, 28, 512) 0 ['block2_4_conv3[0][0]']
2D)
block2_4_conv4 (Conv2D) (None, 28, 28, 512) 262656 ['add_5[0][0]']
add_6 (Add) (None, 28, 28, 512) 0 ['block2_4_conv3Pad[0][0]',
'block2_4_conv4[0][0]']
block3_1_conv1 (Conv2D) (None, 14, 14, 256) 131328 ['add_6[0][0]']
block3_1_conv2 (Conv2D) (None, 12, 12, 256) 590080 ['block3_1_conv1[0][0]']
block3_1_conv3 (Conv2D) (None, 12, 12, 1024 263168 ['block3_1_conv2[0][0]']
)
block3_1_conv3Pad (ZeroPadding (None, 14, 14, 1024 0 ['block3_1_conv3[0][0]']
2D) )
block3_1_conv4 (Conv2D) (None, 14, 14, 1024 525312 ['add_6[0][0]']
)
add_7 (Add) (None, 14, 14, 1024 0 ['block3_1_conv3Pad[0][0]',
) 'block3_1_conv4[0][0]']
block3_2_conv1 (Conv2D) (None, 14, 14, 256) 262400 ['add_7[0][0]']
block3_2_conv2 (Conv2D) (None, 12, 12, 256) 590080 ['block3_2_conv1[0][0]']
block3_2_conv3 (Conv2D) (None, 12, 12, 1024 263168 ['block3_2_conv2[0][0]']
)
block3_2_conv3Pad (ZeroPadding (None, 14, 14, 1024 0 ['block3_2_conv3[0][0]']
2D) )
block3_2_conv4 (Conv2D) (None, 14, 14, 1024 1049600 ['add_7[0][0]']
)
add_8 (Add) (None, 14, 14, 1024 0 ['block3_2_conv3Pad[0][0]',
) 'block3_2_conv4[0][0]']
block3_3_conv1 (Conv2D) (None, 14, 14, 256) 262400 ['add_8[0][0]']
block3_3_conv2 (Conv2D) (None, 12, 12, 256) 590080 ['block3_3_conv1[0][0]']
block3_3_conv3 (Conv2D) (None, 12, 12, 1024 263168 ['block3_3_conv2[0][0]']
)
block3_3_conv3Pad (ZeroPadding (None, 14, 14, 1024 0 ['block3_3_conv3[0][0]']
2D) )
block3_3_conv4 (Conv2D) (None, 14, 14, 1024 1049600 ['add_8[0][0]']
)
add_9 (Add) (None, 14, 14, 1024 0 ['block3_3_conv3Pad[0][0]',
) 'block3_3_conv4[0][0]']
block3_4_conv1 (Conv2D) (None, 14, 14, 256) 262400 ['add_9[0][0]']
block3_4_conv2 (Conv2D) (None, 12, 12, 256) 590080 ['block3_4_conv1[0][0]']
block3_4_conv3 (Conv2D) (None, 12, 12, 1024 263168 ['block3_4_conv2[0][0]']
)
block3_4_conv3Pad (ZeroPadding (None, 14, 14, 1024 0 ['block3_4_conv3[0][0]']
2D) )
block3_4_conv4 (Conv2D) (None, 14, 14, 1024 1049600 ['add_9[0][0]']
)
add_10 (Add) (None, 14, 14, 1024 0 ['block3_4_conv3Pad[0][0]',
) 'block3_4_conv4[0][0]']
block3_5_conv1 (Conv2D) (None, 14, 14, 256) 262400 ['add_10[0][0]']
block3_5_conv2 (Conv2D) (None, 12, 12, 256) 590080 ['block3_5_conv1[0][0]']
block3_5_conv3 (Conv2D) (None, 12, 12, 1024 263168 ['block3_5_conv2[0][0]']
)
block3_5_conv3Pad (ZeroPadding (None, 14, 14, 1024 0 ['block3_5_conv3[0][0]']
2D) )
block3_5_conv4 (Conv2D) (None, 14, 14, 1024 1049600 ['add_10[0][0]']
)
add_11 (Add) (None, 14, 14, 1024 0 ['block3_5_conv3Pad[0][0]',
) 'block3_5_conv4[0][0]']
block3_6_conv1 (Conv2D) (None, 14, 14, 256) 262400 ['add_11[0][0]']
block3_6_conv2 (Conv2D) (None, 12, 12, 256) 590080 ['block3_6_conv1[0][0]']
block3_6_conv3 (Conv2D) (None, 12, 12, 1024 263168 ['block3_6_conv2[0][0]']
)
block3_6_conv3Pad (ZeroPadding (None, 14, 14, 1024 0 ['block3_6_conv3[0][0]']
2D) )
block3_6_conv4 (Conv2D) (None, 14, 14, 1024 1049600 ['add_11[0][0]']
)
add_12 (Add) (None, 14, 14, 1024 0 ['block3_6_conv3Pad[0][0]',
) 'block3_6_conv4[0][0]']
block4_1_conv1 (Conv2D) (None, 7, 7, 512) 524800 ['add_12[0][0]']
block4_1_conv2 (Conv2D) (None, 5, 5, 512) 2359808 ['block4_1_conv1[0][0]']
block4_1_conv3 (Conv2D) (None, 5, 5, 2048) 1050624 ['block4_1_conv2[0][0]']
block4_1_conv3Pad (ZeroPadding (None, 7, 7, 2048) 0 ['block4_1_conv3[0][0]']
2D)
block4_1_conv4 (Conv2D) (None, 7, 7, 2048) 2099200 ['add_12[0][0]']
add_13 (Add) (None, 7, 7, 2048) 0 ['block4_1_conv3Pad[0][0]',
'block4_1_conv4[0][0]']
block4_2_conv1 (Conv2D) (None, 7, 7, 512) 1049088 ['add_13[0][0]']
block4_2_conv2 (Conv2D) (None, 5, 5, 512) 2359808 ['block4_2_conv1[0][0]']
block4_2_conv3 (Conv2D) (None, 5, 5, 2048) 1050624 ['block4_2_conv2[0][0]']
block4_2_conv3Pad (ZeroPadding (None, 7, 7, 2048) 0 ['block4_2_conv3[0][0]']
2D)
block4_2_conv4 (Conv2D) (None, 7, 7, 2048) 4196352 ['add_13[0][0]']
add_14 (Add) (None, 7, 7, 2048) 0 ['block4_2_conv3Pad[0][0]',
'block4_2_conv4[0][0]']
block4_3_conv1 (Conv2D) (None, 7, 7, 512) 1049088 ['add_14[0][0]']
block4_3_conv2 (Conv2D) (None, 5, 5, 512) 2359808 ['block4_3_conv1[0][0]']
block4_3_conv3 (Conv2D) (None, 5, 5, 2048) 1050624 ['block4_3_conv2[0][0]']
block4_3_conv3Pad (ZeroPadding (None, 7, 7, 2048) 0 ['block4_3_conv3[0][0]']
2D)
block4_3_conv4 (Conv2D) (None, 7, 7, 2048) 4196352 ['add_14[0][0]']
add_15 (Add) (None, 7, 7, 2048) 0 ['block4_3_conv3Pad[0][0]',
'block4_3_conv4[0][0]']
average_pool (AveragePooling2D (None, 1, 1, 2048) 0 ['add_15[0][0]']
)
out_layer (Dense) (None, 1, 1, 2) 4098 ['average_pool[0][0]']
==================================================================================================
Total params: 38,045,826
Trainable params: 38,045,826
Non-trainable params: 0
__________________________________________________________________________________________________
layer's length=102
0 input_1
1 zero_padding2d
2 conv1
3 conv2_x_maxpooling
4 block1_1_conv1
5 block1_1_conv2
6 block1_1_conv3
7 block1_1_conv3Pad
8 block1_1_conv4
9 add
10 block1_2_conv1
11 block1_2_conv2
12 block1_2_conv3
13 block1_2_conv3Pad
14 block1_2_conv4
15 add_1
16 block1_3_conv1
17 block1_3_conv2
18 block1_3_conv3
19 block1_3_conv3Pad
20 block1_3_conv4
21 add_2
22 block2_1_conv1
23 block2_1_conv2
24 block2_1_conv3
25 block2_1_conv3Pad
26 block2_1_conv4
27 add_3
28 block2_2_conv1
29 block2_2_conv2
30 block2_2_conv3
31 block2_2_conv3Pad
32 block2_2_conv4
33 add_4
34 block2_3_conv1
35 block2_3_conv2
36 block2_3_conv3
37 block2_3_conv3Pad
38 block2_3_conv4
39 add_5
40 block2_4_conv1
41 block2_4_conv2
42 block2_4_conv3
43 block2_4_conv3Pad
44 block2_4_conv4
45 add_6
46 block3_1_conv1
47 block3_1_conv2
48 block3_1_conv3
49 block3_1_conv3Pad
50 block3_1_conv4
51 add_7
52 block3_2_conv1
53 block3_2_conv2
54 block3_2_conv3
55 block3_2_conv3Pad
56 block3_2_conv4
57 add_8
58 block3_3_conv1
59 block3_3_conv2
60 block3_3_conv3
61 block3_3_conv3Pad
62 block3_3_conv4
63 add_9
64 block3_4_conv1
65 block3_4_conv2
66 block3_4_conv3
67 block3_4_conv3Pad
68 block3_4_conv4
69 add_10
70 block3_5_conv1
71 block3_5_conv2
72 block3_5_conv3
73 block3_5_conv3Pad
74 block3_5_conv4
75 add_11
76 block3_6_conv1
77 block3_6_conv2
78 block3_6_conv3
79 block3_6_conv3Pad
80 block3_6_conv4
81 add_12
82 block4_1_conv1
83 block4_1_conv2
84 block4_1_conv3
85 block4_1_conv3Pad
86 block4_1_conv4
87 add_13
88 block4_2_conv1
89 block4_2_conv2
90 block4_2_conv3
91 block4_2_conv3Pad
92 block4_2_conv4
93 add_14
94 block4_3_conv1
95 block4_3_conv2
96 block4_3_conv3
97 block4_3_conv3Pad
98 block4_3_conv4
99 add_15
100 average_pool
101 out_layer