def bottleneck_residual_block(X, f, filters, stage, block, reduce=False, s=2):
# defining name basis
conv_name_base = 'res' + str(stage) + block + '_branch'
bn_name_base = 'bn' + str(stage) + block + '_branch'
# Retrieve Filters
F1, F2, F3 = filters
# Save the input value. You'll need this later to add back to the main path.
X_shortcut = X
if reduce:
# if we are to reduce the spatial size, apply a 1x1 CONV layer to the shortcut path
# to do that, we need both CONV layers to have similar strides
X = Conv2D(filters = F1,
kernel_size = (1, 1),
strides = (s,s),
padding = 'valid',
name = conv_name_base + '2a',
kernel_regularizer=l2(0.0001))(X)
X = BatchNormalization(axis = 3, name = bn_name_base + '2a')(X)
X = Activation('relu')(X)
X_shortcut = Conv2D(filters = F3,
kernel_size = (1, 1),
strides = (s,s),
padding = 'valid',
name = conv_name_base + '1',
kernel_initializer)(X_shortcut)
X_shortcut = BatchNormalization(axis = 3, name = bn_name_base + '1')(X_shortcut)
else:
# First component of main path
X = Conv2D(filters = F1,
kernel_size = (1, 1),
strides = (1,1),
padding = 'valid',
name = conv_name_base + '2a',
kernel_regularizer=l2(0.0001))(X)
X = BatchNormalization(axis = 3, name = bn_name_base + '2a')(X)
X = Activation('relu')(X)
# Second component of main path
X = Conv2D(filters = F2,
kernel_size = (f, f),
strides = (1,1),
padding = 'same',
name = conv_name_base + '2b',
kernel_regularizer=l2(0.0001))(X)
X = BatchNormalization(axis = 3, name = bn_name_base + '2b')(X)
X = Activation('relu')(X)
# Third component of main path
X = Conv2D(filters = F3,
kernel_size = (1, 1),
strides = (1,1),
padding = 'valid',
name = conv_name_base + '2c',
kernel_regularizer=l2(0.0001))(X)
X = BatchNormalization(axis = 3, name = bn_name_base + '2c')(X)
# Final step: Add shortcut value to main path, and pass it through a RELU activation
X = Add()([X, X_shortcut])
X = Activation('relu')(X)
return X
def ResNet50(input_shape, classes):
"""
Arguments:
input_shape -- tuple shape of the images of the dataset
classes -- integer, number of classes
Returns:
model -- a Model() instance in Keras
"""
# Define the input as a tensor with shape input_shape
X_input = Input(input_shape)
# Stage 1
X = Conv2D(64, (7, 7), strides=(2, 2), name='conv1', kernel_initializer)(X_input)
X = BatchNormalization(axis=3, name='bn_conv1')(X)
X = Activation('relu')(X)
X = MaxPooling2D((3, 3), strides=(2, 2))(X)
# Stage 2
X = bottleneck_residual_block(X, 3, [64, 64, 256], stage=2, block='a', reduce=True, s=1)
X = bottleneck_residual_block(X, 3, [64, 64, 256], stage=2, block='b')
X = bottleneck_residual_block(X, 3, [64, 64, 256], stage=2, block='c')
# Stage 3
X = bottleneck_residual_block(X, 3, [128, 128, 512], stage=3, block='a', reduce=True, s=2)
X = bottleneck_residual_block(X, 3, [128, 128, 512], stage=3, block='b')
X = bottleneck_residual_block(X, 3, [128, 128, 512], stage=3, block='c')
X = bottleneck_residual_block(X, 3, [128, 128, 512], stage=3, block='d')
# Stage 4
X = bottleneck_residual_block(X, 3, [256, 256, 1024], stage=4, block='a', reduce=True, s=2)
X = bottleneck_residual_block(X, 3, [256, 256, 1024], stage=4, block='b')
X = bottleneck_residual_block(X, 3, [256, 256, 1024], stage=4, block='c')
X = bottleneck_residual_block(X, 3, [256, 256, 1024], stage=4, block='d')
X = bottleneck_residual_block(X, 3, [256, 256, 1024], stage=4, block='e')
X = bottleneck_residual_block(X, 3, [256, 256, 1024], stage=4, block='f')
# Stage 5
X = bottleneck_residual_block(X, 3, [512, 512, 2048], stage=5, block='a', reduce=True, s=2)
X = bottleneck_residual_block(X, 3, [512, 512, 2048], stage=5, block='b')
X = bottleneck_residual_block(X, 3, [512, 512, 2048], stage=5, block='c')
# AVGPOOL
X = AveragePooling2D((1,1), name="avg_pool")(X)
# output layer
X = Flatten()(X)
X = Dense(1, activation='sigmoid', name='fc' + str(classes), kernel_initializer)(X)
# Create the model
model = Model(inputs = X_input, outputs = X, name='ResNet50')
return model
model_resnet_08 = ResNet50(input_shape = (3, 256, 256), classes = 1)
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter