Да, и это на самом деле просто :) Вам нужно назвать все ваши слои с параметрами и использовать model.save_weights
, чтобы сохранить веса и построить другую модель с желаемой архитектурой, разделяющей некоторые из слоев.Затем вы можете использовать new_model.load_weights(..., by_name=True)
для загрузки только общих слоев, документация .Вот пример:
input = Input(..., name='image_in')
conv1 = Conv2D(..., name='conv2d')(input)
normed = BatchNormalization(...)(conv1)
out = Flatten()(normed)
out = Dense(num_classes, activation='softmax', name='final_dense')(out)
model = Model(input, out)
# ... train etc
model.save_weights(model_file)
Затем вы можете создать другую модель и просто использовать то же имя для слоев, которыми вы хотите поделиться:
input = Input(..., name='image_in')
conv1 = Conv2D(..., name='conv2d')(input) # reuse conv2d
out = Flatten()(conv1) # we got rid of batch
out = Dense(num_classes, activation='softmax', name='final_dense')(out) # reuse final_dense
new_model = Model(input, out)
# ... now load
new_model.load_weights(model_file, by_name=True)
Настройка by_name=True
только загрузкаслои с соответствующим именем в любой архитектуре, которую вы хотите.