resnet50的tensorflow2实现

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,其他我感觉都一样啊。

resnet50的tensorflow2实现_第1张图片 

 resnet50的tensorflow2实现_第2张图片

 resnet50的tensorflow2实现_第3张图片

 conv4_x和conv5_x类似,可以看下代码resnet50的tensorflow2实现_第4张图片

 输出:

(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

你可能感兴趣的:(深度学习,tensorflow2,深度学习)