我正在尝试微调来自Kaggle 内核的一些代码。该模型使用预训练的 VGG16 权重(通过“imagenet”)进行迁移学习。但是,我注意到没有keras 博客中推荐的层冻结层。一种方法是冻结所有 VGG16 层,并在编译期间仅使用代码中的最后 4 层,例如:
for layer in model.layers[:-5]:
layer.trainable = False
假设,这将使用顶层的 imagenet 权重并仅训练最后 5 层。不冻结 VGG16 层有什么后果?
from keras.models import Sequential, Model, load_model
from keras import applications
from keras import optimizers
from keras.layers import Dropout, Flatten, Dense
img_rows, img_cols, img_channel = 224, 224, 3
base_model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_rows, img_cols, img_channel))
add_model = Sequential()
add_model.add(Flatten(input_shape=base_model.output_shape[1:]))
add_model.add(Dense(256, activation='relu'))
add_model.add(Dense(1, activation='sigmoid'))
model = Model(inputs=base_model.input, outputs=add_model(base_model.output))
model.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
metrics=['accuracy'])
model.summary()