Вот несколько связанный вопрос, который я задал на Stack Exchange , на который вы можете сослаться и найти дополнительную информацию.
Чтобы не создавать собственные пользовательские слои, допускающие частичное замораживание,возможно, было бы лучше создать два слоя, где один заморожен, а другой нет.Тогда следующий уровень мог бы соединиться с ними обоими, и остальная сеть была бы той же самой.Затем вы можете использовать небольшое обучение переносу и перенести первый слой из предварительно обученной сети в замороженный слой.Для этого вы можете использовать Функциональный API Keras .
Вот простой пример того, как вы могли бы сделать эту работу.
from tensorflow.python.keras import layers, Model
from tensorflow.python.keras.applications import InceptionV3
# Sample CNN
input_layer = layers.Input(shape=(224, 224, 3))
frozen_layer = layers.Conv2D(32, kernel_size=(3, 3), use_bias=False, trainable=False, name="frozen_layer")(input_layer)
thawed_layer = layers.Conv2D(32, kernel_size=(3, 3), trainable=True)(input_layer)
concat = layers.concatenate([frozen_layer, thawed_layer])
another_layer = layers.Conv2D(64, kernel_size=(3, 3), trainable=True)(concat)
output_layer = layers.Dense(10)(another_layer)
model = Model(inputs=[input_layer], outputs=[output_layer])
# Build a pre-trained model to extract weights from
transfer_model = InceptionV3(weights='imagenet', include_top=False)
assert transfer_model.layers[1].get_weights()[0].shape == model.get_layer(name="frozen_layer").get_weights()[0].shape
# Transfer the weights
model.get_layer(name="frozen_layer").set_weights(transfer_model.layers[1].get_weights())