def build_vgg(img_shape=(3, 224, 224), n_classes=1000, n_layers=16, l2_reg=0.,
load_pretrained=False, freeze_layers_from='base_model'):
# Decide if load pretrained weights from imagenet
if load_pretrained:
weights = 'imagenet'
else:
weights = None
# Get base model
if n_layers==16:
base_model = VGG16(include_top=False, weights=weights,
input_tensor=None, input_shape=img_shape)
elif n_layers==19:
base_model = VGG19(include_top=False, weights=weights,
input_tensor=None, input_shape=img_shape)
else:
raise ValueError('Number of layers should be 16 or 19')
# Add final layers
x = base_model.output
x = Flatten(name="flatten")(x)
x = Dense(4096, activation='relu', name='dense_1')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu', name='dense_2')(x)
x = Dropout(0.5)(x)
x = Dense(n_classes, name='dense_3_{}'.format(n_classes))(x)
predictions = Activation("softmax", name="softmax")(x)
# This is the model we will train
model = Model(input=base_model.input, output=predictions)
# Freeze some layers
if freeze_layers_from is not None:
if freeze_layers_from == 'base_model':
print (' Freezing base model layers')
for layer in base_model.layers:
layer.trainable = False
else:
for i, layer in enumerate(model.layers):
print(i, layer.name)
print (' Freezing from layer 0 to ' + str(freeze_layers_from))
for layer in model.layers[:freeze_layers_from]:
layer.trainable = False
for layer in model.layers[freeze_layers_from:]:
layer.trainable = True
return model
评论列表
文章目录